Что означает следующая строка кода?

arr = [a+b for a,b in list]

Обычно цикл for используется с одной переменной (в данном случае i)

arr = [i for i in list] 

В первом случае несколько переменных 'a' и 'b' используются внутри цикла for, что я не могу понять. Пожалуйста, объясните этот формат.

4
Masquerade 12 Янв 2017 в 09:39

4 ответа

Лучший ответ

Это называется распаковка. Если список (или любой другой итерируемый) содержит двухэлементные итерируемые элементы, их можно распаковать, чтобы к отдельным элементам можно было обращаться как a и b.

Например, если list был определен как

list = [(1, 2), (3, 4), (4, 6)]

Ваш конечный результат будет

arr = [3, 7, 10]

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

Более распространенное использование этой конструкции (возможно, наиболее распространенное, которое я видел) - это enumerate, который возвращает кортеж с индексом, а также элемент из итерируемого. Что-то вроде:

arr = [ind + item for ind, item in enumerate(numbers)]
2
Mad Physicist 12 Янв 2017 в 06:46

Элементы list - это кортежи / список с 2 элементами , и когда мы пишем,

 a,b in x

Мы распаковываем каждый элемент в две разные переменные, a и b

>>> a,b = [1, 2]
>>> a
1
>>> b
2

< Сильный > Пример

>>> x = [ (i, i*i) for i in range(5) ]
>>> x
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]
>>> [ a+b for a,b in x ]
[0, 2, 6, 12, 20]
3
nu11p01n73R 12 Янв 2017 в 06:47

То, что происходит, называется распаковкой кортежей. Каждый элемент в list должен быть кортежем или каким-либо другим эквивалентным типом последовательности, который можно распаковать.

Примере:

l = [(1, 2), (3, 4)]
arr = [a + b  for a, b in l]
print(arr)

Выход:

[3, 7]    # [(1+2), (3+4)]
2
Gustavo Bezerra 12 Янв 2017 в 06:44

for a,b in list деконструирует список кортежей (или список из двух элементов). То есть ожидается, что list будет иметь вид [(a0, b0), (a1, b1), ...].

Итак, [a+b for a,b in list] приводит к [a0+b0, a1+b1, ...].

3
Rushy Panchal 12 Янв 2017 в 06:42