Как перебрать каждую строку в списке строк и оперировать с ней элементами
Я новый для python, и мне нужна помощь с этим.
ЗАДАЧА: задайте список → words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
Мне нужно сравнить первый и последний элементы каждой строки в списке,
если первый и последний элементы в строке совпадают, то увеличивайте счетчик.
Данный список:
words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
Если я попробую вручную, я могу перебирать каждый элемент строк в списке.
words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
w1 = words[0]
print w1
aba
for i in w1:
print i
a
b
a
if w1[0] == w1[len(w1) - 1]:
c += 1
print c
1
Но, когда я пытаюсь выполнить итерацию по всем элементам всех строк в списке, используя цикл FOR.
я получаю сообщение об ошибке.
words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
c = 0
for i in words:
w1 = words[i]
if w1[0] == w1[len(w1) - 1]:
c += 1
print c
ERROR:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: list indices must be integers, not str
пожалуйста, дайте мне знать, как бы мне достичь сравнения первого и последнего элемента no. строки в списке.
Спасибо заранее.
Ответы
Ответ 1
Try:
for word in words:
if word[0] == word[-1]:
c += 1
print c
for word in words
возвращает элементы words
, а не индекс. Если вам нужен индекс когда-нибудь, попробуйте использовать enumerate
:
for idx, word in enumerate(words):
print idx, word
выводит
0, 'aba'
1, 'xyz'
etc.
-1
в word[-1]
выше - это способ Python, говорящий "последний элемент". word[-2]
предоставит вам второй последний элемент и т.д.
Вы также можете использовать генератор для достижения этого.
c = sum(1 for word in words if word[0] == word[-1])
Ответ 2
Причина в том, что во втором примере i
есть само слово, а не индекс слова. Так
for w1 in words:
if w1[0] == w1[len(w1) - 1]:
c += 1
print c
будет эквивалент вашего кода.
Ответ 3
Предложение о том, что использование range(len())
является эквивалентом использования enumerate()
, неверно. Они возвращают те же результаты, но они не совпадают.
Использование enumerate()
действительно дает вам пары ключ/значение. Использование range(len())
не работает.
Сначала проверьте range(len())
(работая из примера с оригинального плаката):
words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
print range(len(words))
Это дает нам простой список:
[0, 1, 2, 3, 4]
... и элементы в этом списке служат "индексами" в наших результатах.
Так что сделайте то же самое с нашей версией enumerate()
:
words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
print enumerate(words)
Это, конечно, не дает нам списка:
<enumerate object at 0x7f6be7f32c30>
... поэтому включите его в список и посмотрите, что произойдет:
print list(enumerate(words))
Это дает нам:
[(0, 'aba'), (1, 'xyz'), (2, 'xgx'), (3, 'dssd'), (4, 'sdjh')]
Это фактические пары ключ/значение.
Итак, это...
words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
for i in range(len(words)):
print "words[{}] = ".format(i), words[i]
... фактически берет первый список (Слова) и создает второй, простой список диапазона, обозначенный длиной первого списка.
Итак, у нас есть два простых списка, и мы просто печатаем один элемент из каждого списка, чтобы получить наши так называемые пары "ключ/значение".
Но они не являются действительно парами ключ/значение; это всего лишь два отдельных элемента, напечатанных в одно и то же время, из разных списков.
В то время как код enumerate ()
:
for i, word in enumerate(words):
print "words[{}] = {}".format(i, word)
... также создает второй список. Но этот список на самом деле представляет собой список пар ключ/значение, и мы запрашиваем каждый ключ и значение из одного источника, а не из двух списков (например, мы сделали выше).
Итак, мы печатаем те же результаты, но источники совершенно разные - и обрабатываются совершенно по-другому.
Ответ 4
Следующий код выводит количество слов, первая и последняя буквы которых равны. Протестировано и проверено с помощью онлайнового компилятора python:
words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
count = 0
for i in words:
if i[0]==i[-1]:
count = count + 1
print(count)
Выход:
$python main.py
3
Ответ 5
c=0
words = ['challa','reddy','challa']
for idx, word in enumerate(words):
if idx==0:
firstword=word
print(firstword)
elif idx == len(words)-1:
lastword=word
print(lastword)
if firstword==lastword:
c=c+1
print(c)
Ответ 6
Используйте диапазон(), а именно:
for i in range(len(words)):
...