2015-10-17 57 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()功能会产生各种组合,然后返回结果的列表。

相关问题