Вложенный список с двумя списками - программирование
Подтвердить что ты не робот

Вложенный список с двумя списками

Я понимаю, как работает простое понимание списка, например:

[x*2 for x in range(5)] # returns [0,2,4,6,8]

а также я понимаю, как работает вложенное подсчет списка:

w_list = ["i_have_a_doubt", "with_the","nested_lists_comprehensions"]

# returns the list of strings without underscore and capitalized
print [replaced.title() for replaced in [el.replace("_"," ")for el in w_list]]

поэтому, когда я попытался сделать это,

l1 = [100,200,300]
l2 = [0,1,2]
[x + y for x in l2 for y in l1 ]

Я ожидал этого:

[101,202,303]

но я получил это:

[100,200,300,101,201,301,102,202,302]

поэтому я получил лучший способ решить проблему, которая дала мне то, что я хочу

[x + y for x,y in zip(l1,l2)]

но я не понял возврат 9 элементов в первый код

4b9b3361

Ответ 1

Причина, по которой он имеет 9 чисел, заключается в том, что python рассматривает

[x + y for x in l2 for y in l1 ]

аналогично

for x in l2:
    for y in l1:
       x + y

т.е. это вложенный цикл

Ответ 2

Перечисления списков эквивалентны for-loops. Поэтому [x + y for x in l2 for y in l1 ] станет:

new_list = []
for x in l2:
    for y in l1:
        new_list.append(x + y)

В то время как zip возвращает кортежи, содержащие один элемент из каждого списка. Поэтому [x + y for x,y in zip(l1,l2)] эквивалентно:

new_list = []
assert len(l1) == len(l2)
for index in xrange(len(l1)):
    new_list.append(l1[index] + l2[index])

Ответ 3

Вышеуказанные ответы будут достаточными для вашего вопроса, но я хотел бы предоставить вам решение для понимания списка для справки (поскольку это был ваш начальный код и то, что вы пытаетесь понять).

Предполагая, что длина обоих списков одинакова, вы можете сделать:

[l1[i] + l2[i] for i in range(0, len(l1))]

Ответ 4

[x + y for x in l2 for y in l1 ]

эквивалентно:

lis = []
for x in l:
   for y in l1:
      lis.append(x+y)

Итак, для каждого элемента l вы повторяете l2 снова и снова, поскольку l имеет 3 элемента, а l1 имеет элементы, поэтому итоговые циклы равны 9 (len(l)*len(l1)).

Ответ 5

эта последовательность

res = [x + y for x in l2 for y in l1 ]

эквивалентно

res =[]
for x in l2:
    for y in l1:
        res.append(x+y)