1
votes

Plusieurs boucles 'for' dans la liste en Python

Voici le code que j'ai essayé:

books = [(17,5), (3,55), (5,12), (14,9), (16,1), (9,5), (5,6), (18,13), (19,7), (1,20), (4,12), (11,1), (8,6), (8,18), (3,4), (13,7), (17,22), (20,7)]
lista = [[(0,9), (3,10), (6,15)]]

Bonjour, je ne suis pas très familier avec les boucles dans une liste - compréhension de liste. J'ai une liste nommée 'books' et une liste nommée 'lista' . Je veux trouver le deuxième élément de chaque tuple dans books avec lista comme index et stocker les paires correspondantes dans des listes booksa et booksb .

booksa = [book[i] for book in books for k in range(len(lista)) for i in lista[k][0] ]
booksb = [book[j] for book in books for e in range(len(lista)) for j in lista[e][1] ]

Par exemple, pour (0,9) dans lista , nous regardons en arrière sur livres et trouvez 17 (0 signifie le premier tuple) dans (17,5) puis mettez 17 dans booksa , et 7 (9 signifie le huitième tuple) dans (9,5) pour mettre dans booksb .

Comment puis-je faire cela dans une liste avec des boucles «for»?


1 commentaires

"9 signifie le huitième tuple" - Ce n'est pas clair. Dans ce cas, 0 signifie quel tuple? 0 et 1 représentent-ils le même tuple?


3 Réponses :


2
votes

La logique appliquée est comme ci-dessous:

  • Choisissez le premier élément de l'élément de tuple lista et utilisez-le pour l'indexer dans la liste des livres et obtenir le premier élément du tuple présent pour l'ajouter à booksa
  • Choisissez le deuxième élément dans l'élément de tuple lista et utilisez-le pour indexer dans la liste des livres et obtenir le deuxième élément de tuple présent pour l'ajouter aux livresb

Vérifiez le code ci-dessous:

booksa = [17, 14, 5]
booksb = [20, 12, 7]

Sortie:

books = [(17,5), (3,55), (5,12), (14,9), (16,1), (9,5), (5,6), (18,13), (19,7), (1,20), (4,12), (11,1), (8,6), (8,18), (3,4), (13,7), (17,22), (20,7)]
lista = [[(0,9), (3,10), (6,15)]]

booksa = []
booksb = []
for x in lista:
   for y in x:
       booksa.append(books[y[0]][0])
       booksb.append(books[y[1]][1])

print ("booksa = %s" %(booksa))
print ("booksb = %s" %(booksb))


0 commentaires

1
votes

en utilisant la compréhension de liste

books = [(17,5), (3,55), (5,12), (14,9), (16,1), (9,5), (5,6), (18,13), (19,7), (1,20), (4,12), (11,1), (8,6), (8,18), (3,4), (13,7), (17,22), (20,7)]
lista = [[(0,9), (3,10), (6,15)]]

booksa = [books[k[0]][0] for j in lista for k in j]
booksb = [books[k[1]][1] for j in lista for k in j]

"""
# output 
booksa = [17, 14, 5]
booksb = [20, 12, 7]
"""


0 commentaires

0
votes

Vous pouvez utiliser la décompression de tuple pour améliorer la lisibilité:

booksa = [books[i][0] for i, _ in lista[0]]
# [17, 14, 5]

booksb = [books[j][1] for _, j in lista[0]]
# [20, 12, 7]

Si vous avez plusieurs sous-listes dans lista , utilisez itertools.chain (lista) code > au lieu de lista[0ITED.


0 commentaires