2015-10-17 56 views
0

我想讓腳本從文件中讀取行,比從每行中獲取切片,將來自1行的所有切片與來自2行的所有切片合併,然後合併來自上一步與第三行。列表1中的每個元素與列表2中的所有列表的總和

例如,我們有

Stackoverflow (4) 
python (3) 
question (3) 

我得到的(數量)信片第一個列表。

lst = ['Stac', 'tack', 'acko', 'ckov', 'kove', 'over', 'verf', 'erfl', 'rflo', 'flow'] 

然後我需要將它與第二個列表相結合:

lst = ['pyt', 'yth', 'tho', 'hon'] 

所需的輸出:

finallist = ['Stacpyt', 'tackpyt', 'ackopyt', 'ckovpyt', 'kovepyt', 'overpyt', 'verfpyt', 'erflpyt', 'rflopyt', 'flowpyt' 'Stacyth', 'tackyth', 'ackoyth', 'ckovyth', 'koveyth', 'overyth', 'verfyth', 'erflyth', 'rfloyth', 'flowyth', ..... , 'erflhon', 'rflohon', 'flowhon'] 

然後用3名單:

lst = ['que', 'ues', 'est', 'sti', 'tio', 'ion'] 

finallist = ['Stacpytque', 'tackpytque', 'ackopytque', 'ckovpytque', 'kovepytque', 'overpytque', 'verfpytque', 'erflpytque', 'rflopytque', .... 'erflhonion', 'rflohonion', 'flowhonion'] 

我停留在點我需要與com進行最後決戰結果。

我試圖像這樣的代碼段,但其錯誤:

for i in lst: 
    for y in finallist: 
     finallist.append(i + y) 

所以,如果finallist是空的 - 它應該複製LST在第一循環迭代,如果finallist不是空的,應該每一個元素相結合與第一等。

+0

4/3/3號碼也在文件中?你的例子究竟是如何你的文件看起來像? –

+0

是的,文件中的數字也是。它代表列表的長度。 如果是Stackoverflow(12)。腳本應該製作[「Stackoverflo」,「tackoverflow」]。 說實話,我沒有學習如何過濾字符串來獲取int,所以我現在就跳過它並創建了一個變量。 – Nova

+0

文件可以包含任意數量的字符串,而不僅僅是3.對不起,誤解 – Nova

回答

0

我使用re.match()爲了從您的文件中獲得單詞和整數值。

然後,我計算所有切片的子詞並將它們添加到列表中,然後將它添加到全局列表中。

最後,我計算了所有你正在尋找的可能性,感謝itertools.product(),它的行爲像一個嵌套for循環。

然後,.join()元組獲得,你得到你想要的最終名單。

from itertools import product 
from re import match 

the_lists = [] 

with open("filename.txt", "r") as file: 
    for line in file: 
     m = match(r'(.*) \((\d+)\)', line) 
     word = m.group(1) 
     num = int(m.group(2)) 
     the_list = [word[i:i+num] for i in range(len(word) - num + 1)] 
     the_lists.append(the_list) 

combinaisons = product(*the_lists) 

final_list = ["".join(c) for c in combinaisons] 
+0

非常感謝。這正是我想要做的。 – Nova

0

使用ittertools

import itertools 
list1 = ['Stac', 'tack', 'acko', 'ckov', 'kove', 'over', 'verf', 'erfl', 'rflo', 'flow'] 
list2 = ['pyt', 'yth', 'tho', 'hon'] 
list3 = ['que', 'ues', 'est', 'sti', 'tio', 'ion'] 

final_list = list(itertools.product(list(itertools.product(list1,list2)),list3)) 

這會給你所有的組合,那麼你可以加入他們都得到您的字符串。

+0

列表數量等於字符串數量。它可以超過3個。所以我做了一個循環,使每一行的列表。在這個循環的iinside中,我想創建另一個結合finallist(它在計數0上爲空)與當前列表 – Nova

+0

對不起,沒有閱讀那部分。在這種情況下,使用包含所有項目的列表來創建* for循環*,然後使用itertools。 – Dexter

+0

我用循環'alllst = finallist(itertools.product(finallist,templist))'我沒有得到想要的輸出。 ('Stac','pyt'),'que'),(('Stac','pyt'),'ues'),(('Stac','pyt'),'est' ),(('Stac','pyt'),'sti'),(('Stac','pyt'),'tio'),(('Stac','pyt'),'ion' (('Stac','yth'),'que'),(('Stac','yth'),'ues')' 項目不在一起。 而第二個: 如果finallist在開始時爲空。最後我得到空列表。只有這樣才能解決它在循環中使'if count == 1:finallist = templist'? – Nova

0
import itertools 

def combine(lst): 
    result = list(itertools.product(*lst)) 
    result = [''.join(item) for item in result] 
    return result 

list1 = ['Stac', 'tack', 'acko', 'ckov', 'kove', 'over', 'verf', 'erfl', 'rflo', 'flow'] 
list2 = ['pyt', 'yth', 'tho', 'hon'] 
list3 = ['que', 'ues', 'est', 'sti', 'tio', 'ion'] 

lst = [list1, list2, list3] # append more list to lst, then pass lst to combination 
print combine(lst) 

追加所有的候選人名單,以lstcombine()功能會產生各種組合,然後返回結果的列表。

相關問題