2016-08-11 3 views
1

Есть ли более простой способ перебора нескольких строк, чем массивное количество вложенных циклов?Python: Избегайте использования нескольких вложенных циклов для итерации по строкам

list = ['rst','uvw','xy'] 

for x in list[0]: 
    for y in list[1]: 
     for z in list[2]: 
      print x+y+z 

rux 
ruy 
... 
tvx 
tvy 
twx 
twy 

Пример список Я действительно хочу, чтобы не вводить писать петлю для:

list = ['rst','uvw','xy','awfg22','xayx','1bbc1','thij','bob','thisistomuch'] 

ответ

2

Вам нужно itertools.product:

import itertools 
list = ['rst','uvw','xy','awfg22','xayx','1bbc1','thij','bob','thisistomuch'] 
for x in itertools.product(*list): 
    print(''.join(x)) 

продукта возвращает все возможные кортежи элементов из итераторов он получает , Так

itertools.product('ab', 'cd') 

возвращает генератор, получая ('A', 'C'), ('A', 'd'), ('B', 'C'), ('B', ' d ')

+0

Спасибо, именно то, что я искал! – Eplox

3

Вы ищете product функции от itertools:

import itertools 

lst = ['rst','uvw','xy'] 
[''.join(s) for s in itertools.product(*lst)] 

# ['rux', 
# 'ruy', 
# 'rvx', 
# 'rvy', 
# 'rwx', 
# ... 
# 'twx', 
# 'twy'] 
0

Другим способом? Определенно. Simpler? Может быть, нет ...

Я предполагаю, что это потому, что вы не обязательно знаете, сколько строк у вас будет в вашем списке.

насчет: сл = [ 'ABC', 'MnO', 'хуг']

def strCombo(l,s=''): 
    if(len(l)==0): 
     return s 
    elif(len(l)==1): 
     return [(s+x) for x in l[0]] 
    else: 
     return [strCombo(l[1:],(s+x)) for x in l[0]] 



final = [] 
for x in strCombo(sl)[0]: 
    final = final + x 
Смежные вопросы