Как перебрать каждую строку в списке строк и оперировать с ней элементами

Я новый для 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)):
    ...