2014-01-14 1 views
0

Мне нужна возможность делать вложенные циклы в разных списках, для пример:Как пропустить все пути выборки в списке списков: [[1,2,3,], [1,2,3], ...]

A = [1,2,3] 
B = [1,2,3] 
C = [1,2,3] 

for a in A: 
    for b in B: 
     for c in C: 
     #do something 

то, что я хочу, чтобы иметь некоторый код, который может взять список списков, заданных [A]+[B]+[C] и перебрать каждый путь выборки (то есть то же самое, что и выше вложенные циклы делают).

Это нормально, если этот код занимает 2 или 3 строки, поскольку в моем примере с реальным я имею не только A,B,C, но и D,E,F,G,..., поэтому выполнение вложенного цикла, как указано выше, слишком утомительно.

+0

'A + B + C' предоставит вам другой список, а не список списков. – wim

+0

@wim Исправлено. Я думаю, что предложение перестановок не будет работать. Я ищу функциональность вложенных циклов, а не перестановку. – user2763361

ответ

2

Вы ищете продукт из трех списков; с помощью itertools.product() позволяет сворачивать три вложенных цикла для:

from itertools import product 

for a, b, c in product(A, B, C): 

Поскольку A == B == C здесь, можно упростить, что дальше:

for a, b, c in product(A, repeat=3): 

Если у вас есть несколько списков, чтобы произвести продукт, поместите их в список, так что вы можете производить продукт с переменным числом входных списков:

lists = [A, B, C, D, E] 
for combination in product(*lists): 
0

Упаковать свои подсписки в список списков и распаковать их с помощью оператора «splat» *. Это позволит вам перебирать столько циклов, сколько потребуется, только на одном уровне вложенности.

>>> A = [1, 2, 3] 
>>> B = ['a', 'b', 'c'] 
>>> mylists = [A, B] 
>>> from itertools import product 
>>> for x in product(*mylists): 
...  print x 
(1, 'a') 
(1, 'b') 
(1, 'c') 
(2, 'a') 
(2, 'b') 
(2, 'c') 
(3, 'a') 
(3, 'b') 
(3, 'c') 
1

вы хотите декартово произведение из itertools:

from itertools import product 
for x in product(A,B,C): 
    print x 

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

  • Нет связанных вопросов^_^