2015-10-06 3 views
1

У меня есть список списков и необходимо сделать экстракт каждый элемент; в конечном счете, написать их декартово произведение.Python: извлечение из списка списков

from itertools import product 

b = {} 
a = [[1, 2], [3, 4], ['a', 'b']] 

for i, v in enumerate(a): 
    b[i] = v 

#These don't work because we are feeding a single list to product 
print list(product(x for x in a)) # [([1, 2],), ([3, 4],), (['a', 'b'],)] 
print list(product(b.values())) # [([1, 2],), ([3, 4],), (['a', 'b'],)] 

В product работает правильно, если я могу получить это:

print list(product([1, 2], [3, 4], ['a', 'b'])) 
[(1, 3, 'a'), (1, 3, 'b'), (1, 4, 'a'), (1, 4, 'b'), (2, 3, 'a'), (2, 3, 'b'), (2, 4, 'a'), (2, 4, 'b')] 

ответ

1

Распаковка a в itertools.product с помощью *. Пример -

print list(product(*a)) 

Распаковка бы отправить каждый элемент a как отдельный аргумент в product, вместо одного списка (так же, как - list(product([1, 2], [3, 4], ['a', 'b']))).

Demo -

>>> a = [[1, 2], [3, 4], ['a', 'b']] 
>>> from itertools import product 
>>> print(list(product(*a))) 
[(1, 3, 'a'), (1, 3, 'b'), (1, 4, 'a'), (1, 4, 'b'), (2, 3, 'a'), (2, 3, 'b'), (2, 4, 'a'), (2, 4, 'b')] 
+0

Ухоженная. Я видел оператор '*' много раз. Одинаково ли он работает везде? –

+1

В вызовах функций (например, выше) да. Но когда вы используете его в определении функции, оно отличается. Затем это означает любое количество позиционных аргументов (и все эти позиционные аргументы затем помещаются в список с именем, которое вы использовали после '*'). –

+0

Да, это означает, что вы хотите разрешить произвольное количество аргументов. Верный ? –

Смежные вопросы