Несколько «для» цикла в списке в Python - PullRequest
0 голосов
/ 14 марта 2019

Вот код, который я пробовал:

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] ]

Привет, я не настолько знаком с циклами в понимании списков.У меня есть список с именем 'books' и список с именем 'lista'.Я хочу найти второй элемент каждого кортежа в books с lista в качестве индекса и сохранить соответствующие пары в списках booksa и booksb.

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)]]

Например, для (0,9) в lista мы оглядываемся на books и находим 17 (0 означает первый кортеж) в (17,5), а затем помещаем 17в booksa и 7 (9 означает восьмой кортеж) в (9,5) для вставки booksb.

Как я могу сделать это в списке с некоторыми циклами for?

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Применяемая логика выглядит следующим образом:

  • Выберите первый элемент в элементе кортежа lista и используйте его для индексации в списке books и получения первого элемента кортежа, добавленного к booksa
  • Выберите второй элемент в элементе кортежа lista и используйте его для индексации в списке books и получите второй элемент кортежа, который там присутствует, для добавления к booksb

Проверьте код ниже:

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))

Выход:

booksa = [17, 14, 5]
booksb = [20, 12, 7]
1 голос
/ 14 марта 2019

с использованием понимания списка

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 голосов
/ 14 марта 2019

Вы можете использовать распаковку кортежей для улучшения читабельности:

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

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

Если у вас есть несколько подсписков в lista, используйте itertools.chain(lista) вместо lista[0].

...