2017-07-28 55 views
2

我有一個字符串和列表組成的列表:如何在python中線性組合列表列表,而不是每個項目都是列表?

a = ['a', 'b', 'c', 'd', 'e', ['fgh', 'rst'], 'i',['quv','wxy']] 

如何加入每一個元素在此列表中,這樣所有的字符串元素包含每個內部列表元素之一,同時保持其原來的位置清單?例如:

targets = ['abcdefghiquv', 
      'abcdefghiwxy', 
      'abcderstiquv', 
      'abcderstiwxy', 
      ] 

我在下面的方式嘗試過,但是,如果最後一個元素是一個列表

combinations = [] 
combinations2 = [] 
for s in a: 
    if isinstance(s, basestring): 
     combinations.append(s) 
    else: 
     seqint = ''.join(combinations) 
     combinations2.append([seqint]) 
     combinations2.append(s) 
     combinations[:]=[] 
for comb in list(itertools.product(*combinations2)): 
    print ''.join(comb) 
+1

你嘗試過什麼已經試圖解決這個問題?你能展示你的代碼並解釋你面臨的困難嗎? – idjaw

回答

1

使用itertools.product肯定是要走的路這僅適用。我會做這種方式(可能不完全正確的,因爲我從來沒有使用傳統的Python多):

# helper function 
def strtolist(o): 
    '''Takes an object and puts it in a list if it's a string''' 
    if isinstance(o, str): 
     return [o] 
    return o 

a = ['a', 'b', 'c', 'd', 'e', ['fgh', 'rst'], 'i',['quv','wxy']] 
newa = [strtolist(item) for item in a] 

這最後一步被稱爲列表理解。它們非常有用,因此它可以很好地利用時間去閱讀它們(還有字典理解和生成器理解)。

現在我們有一個新的列表,看起來像這樣:

newa = [['a'], ['b'], ['c'], ['d'], ['e'], ['fgh', 'rst'], ['i'],['quv','wxy']] 

然後完成了同之前一樣:

from itertools import product 

for comb in list(product(*newa)): 
    print ''.join(comb) 

編輯:如果你真的想要得到粗糙,你可以在一個陳述中完成所有這些。但我不建議這樣做(不是很可讀):

>>> result = [''.join(combo) for combo in product(*[([item] if isinstance(item, basestr) else item) for item in a])] 
>>> assert result == targets 
# no error: success 

好像你是在學習,所以我會做一個附加註釋的過程:除非你有一個很好的理由使用傳統學習Python(2),我建議切換到現代Python(當前版本3.6)。這是目前所有的方向(儘管傳統的Python在很多情況下可能還會存在很長一段時間)。

0

通過獲取列表索引和使用itertools.product

a = ['a', 'b', 'c', 'd', 'e', ['fgh', 'rst'], 'i',['quv','wxy'] ] 
idx = [] 
lst = [] 
for i in a: 
    if isinstance(i, list): 
     idx.append(a.index(i)) 
     lst.append(i) 

from itertools import product 

for j in [ dict(zip(idx,i)) for i in product(*lst) ] : 
    for k,v in j.items(): 
     a[k] = v 
    print (''.join(a)) 
0

作爲一個實用的風格,你可以reduce列表中的另一種方法:

list(reduce(lambda x, y: (x1 + "".join(y1) for x1 in x for y1 in y), a)) 
['abcdefghiquv', 'abcdefghiwxy', 'abcderstiquv', 'abcderstiwxy'] 
相關問題