Ответ 1
Причина, по которой он имеет 9 чисел, заключается в том, что python рассматривает
[x + y for x in l2 for y in l1 ]
аналогично
for x in l2:
for y in l1:
x + y
т.е. это вложенный цикл
Я понимаю, как работает простое понимание списка, например:
[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 элементов в первый код
Причина, по которой он имеет 9 чисел, заключается в том, что python рассматривает
[x + y for x in l2 for y in l1 ]
аналогично
for x in l2:
for y in l1:
x + y
т.е. это вложенный цикл
Перечисления списков эквивалентны 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])
Вышеуказанные ответы будут достаточными для вашего вопроса, но я хотел бы предоставить вам решение для понимания списка для справки (поскольку это был ваш начальный код и то, что вы пытаетесь понять).
Предполагая, что длина обоих списков одинакова, вы можете сделать:
[l1[i] + l2[i] for i in range(0, len(l1))]
[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)
).
эта последовательность
res = [x + y for x in l2 for y in l1 ]
эквивалентно
res =[]
for x in l2:
for y in l1:
res.append(x+y)