web-dev-qa-db-fra.com

en python: itérer sur chaque chaîne d'une liste

Je suis nouveau sur Python et j'ai besoin d'aide pour cela.

TÂCHE: donné une liste -> words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']

je dois comparer le premier et le dernier élément de chaque chaîne de la liste. Si le premier et le dernier élément de la chaîne sont identiques, incrémenter le nombre.

La liste donnée est:

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']

Si j'essaie manuellement, je peux parcourir chaque élément des chaînes de la liste.

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

Mais, quand j'essaye de parcourir tous les éléments de toutes les chaînes de la liste, en utilisant une boucle FOR.

je reçois une erreur.

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

ERREUR:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: list indices must be integers, not str

s'il vous plaît laissez-moi savoir, comment pourrais-je réaliser en comparant le premier et le dernier élément d'un non. chaînes dans la liste.

Merci d'avance.

13
user3168141

Essayer:

for Word in words:
    if Word[0] == Word[-1]:
        c += 1
    print c

for Word in words renvoie les éléments de words, pas l'index. Si vous avez parfois besoin de l'index, essayez d'utiliser enumerate:

for idx, Word in enumerate(words):
    print idx, Word

serait sortie

0, 'aba'
1, 'xyz'
etc.

Le -1 dans Word[-1] ci-dessus est la façon dont Python dit "le dernier élément". Word[-2] vous donnerait l'avant-dernier élément, et ainsi de suite.

Vous pouvez également utiliser un générateur pour y parvenir.

c = sum(1 for Word in words if Word[0] == Word[-1])
29
Steinar Lima

La suggestion selon laquelle utiliser range(len()) équivaut à utiliser enumerate() est incorrecte. Ils renvoient les mêmes résultats, mais ils sont pas les mêmes.

Utiliser enumerate() vous donne en réalité des paires clé/valeur. Utiliser range(len()) ne le fait pas.

Vérifions d'abord range(len()) (à partir de l'exemple de l'affiche originale):

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
    print range(len(words))

Cela nous donne une liste simple:

[0, 1, 2, 3, 4]

... et les éléments de cette liste servent "d'index" dans nos résultats.

Faisons donc la même chose avec notre version enumerate():

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']    
   print enumerate(words)

Cela ne nous donne certainement pas une liste:

<enumerate object at 0x7f6be7f32c30>

... alors transformons-la en une liste et voyons ce qui se passe:

print list(enumerate(words))

Cela nous donne:

[(0, 'aba'), (1, 'xyz'), (2, 'xgx'), (3, 'dssd'), (4, 'sdjh')]

Ce sont des paires clé/valeur réelles.

Donc ça ...

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']

for i in range(len(words)):
    print "words[{}] = ".format(i), words[i]

... prend en fait la première liste (Mots) et crée une seconde, liste simple de la plage indiquée par la longueur de la première liste.

Nous avons donc deux listes simples et nous imprimons simplement un élément de chaque liste afin d’obtenir nos paires dites "clé/valeur".

Mais ils ne sont pas vraiment des paires clé/valeur; ce ne sont que deux éléments simples imprimés simultanément, issus de listes différentes.

Considérant que le code enumerate ():

for i, Word in enumerate(words):
    print "words[{}] = {}".format(i, Word)

... crée également une deuxième liste. Mais cette liste en fait est une liste de paires clé/valeur, et nous demandons pour chaque clé et valeur d'une source unique - plutôt que de deux listes (comme nous l'avons fait ci-dessus).

Nous imprimons donc les mêmes résultats, mais les sources sont complètement différentes et traitées de manière totalement différente.

2
fra

La raison en est que, dans votre deuxième exemple, i est le mot lui-même, pas l'index du mot. Alors

for w1 in words:
     if w1[0] == w1[len(w1) - 1]:
       c += 1
     print c

serait l'équivalent de votre code.

1
ShinTakezou

Le code suivant indique le nombre de mots dont les première et dernière lettres sont égales. Testé et vérifié à l'aide d'un compilateur en ligne python :

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']  
count = 0  
for i in words:  
     if i[0]==i[-1]:
        count = count + 1  
print(count)  

Sortie:

$python main.py
3
1
ibsa