#python #for-loop #arraylist #nested-loops
#python #цикл for #arraylist #вложенные циклы
Вопрос:
Вот код, который я пробовал :
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
with 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)
in lista
мы возвращаемся к books
и находим 17
(0 означает первый кортеж) в (17,5)
, а затем вставляем 17
в booksa
, и 7
(9 означает восьмой кортеж) в (9,5)
, чтобы вставить booksb
.
Как я могу сделать это в списке с некоторыми циклами ‘for’?
Комментарии:
1. «9 означает восьмой кортеж» — это непонятно. В этом случае 0 означает, какой кортеж? Представляют ли 0 и 1 один и тот же кортеж?
Ответ №1:
Применяемая логика выглядит следующим образом:
- Выберите первый элемент в
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]
Ответ №2:
использование понимания списка
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]
"""
Ответ №3:
Вы можете использовать распаковку кортежей для улучшения удобочитаемости:
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]
.