python - Itertools - 合并两个列表以获得所有可能的组合

标签 python combinations permutation python-itertools

我有两个列表:ab

a 是一个包含三个或更多字符串的列表,而 b 是一个分隔符列表。

我需要生成 a 的所有可能组合,然后将结果与 b 的所有可能组合“合并”(参见示例以更好地理解)。

我最终使用了这段代码:

from itertools import permutations, combinations, product

a = ["filename", "timestamp", "custom"]
b = ["_", "-", ".", ""]

output = []

for com in combinations(b, len(a) - 1):
    for per in product(com, repeat=len(a) - 1):
        for ear_per in permutations(a):
            out = ''.join(map(''.join, zip(list(ear_per[:-1]), per))) + list(ear_per)[-1]
            output.append(out)

# For some reason the algorithm is generating duplicates
output = list(dict.fromkeys(output))

for o in output:
    print o

这是输出示例(这是正确的,在这种情况下这是我需要的):

timestamp.customfilename
filenamecustom.timestamp
custom_filenametimestamp
timestamp_custom_filename
timestamp-filename.custom
custom_filename-timestamp
filename.timestamp-custom
. . .
filename.custom.timestamp
filename-customtimestamp
custom-timestamp_filename
filename_custom-timestamp
filename.timestampcustom
timestampcustom-filename
custom-timestamp.filename
filenamecustom_timestamp
timestamp.custom_filename
custom.timestampfilename
timestampfilename.custom
customfilename_timestamp
filenametimestamp-custom
custom-filenametimestamp
timestampfilename-custom
timestamp-custom-filename
custom.filenametimestamp
customfilenametimestamp
timestampfilename_custom
custom_filename.timestamp
custom-timestamp-filename
custom-timestampfilename
filename_timestamp.custom
. . .
filename.custom-timestamp
timestamp_filenamecustom
custom_timestampfilename
timestamp.custom.filename
timestamp.filename-custom
filename-custom-timestamp
customfilename.timestamp
filename_timestamp_custom
timestamp_filename.custom
customtimestampfilename
filenamecustomtimestamp
custom.timestamp_filename
filename_customtimestamp
. . .
timestamp-customfilename
filename_custom.timestamp

这个算法有两个主要问题:

  1. 它会生成一些重复的行,所以我总是需要删除它们(在较大的数据集上速度较慢)

  2. if len(a) > len(b) + 2 脚本不会启动。在那种情况下,我需要重复分隔符以覆盖 len(a) - 1 a 中包含的单词之间的可用空间。

最佳答案

这可能是一个可行的解决方案。它采用 a 的排列,(3*2 = 6),与 b product 交错排列(这里一次 2,4*4 == 16),总共得到6 * 16 == 96个结果。

from itertools import permutations, chain, zip_longest, product

a = ["filename", "timestamp", "custom"]
b = ["_", "-", ".", ""]

i=0
for perm in permutations(a):
    for prod in product(b,repeat=len(a)-1):
        tpls = list(chain.from_iterable(zip_longest(perm, prod, fillvalue='')))
        print(''.join(tpls))
        i += 1
print(i)

关于python - Itertools - 合并两个列表以获得所有可能的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57876864/

相关文章:

python - pandas 从日期时间索引中删除秒

arrays - 在Perl中,如何生成列表的所有可能组合?

r - 如何查找列中的所有组合并计算数据中的出现次数

r - 在给定的长度上,所有可能的十进制数字(百分数)的总和为1

python - 将矩阵从 [?, 100] reshape 为 [batch_size, ?, 100]

python - 将文档内链接添加到 PDF

c++ - 在组合对之间找到共享元素的最佳方法

python - 创建相同 BST 的节点插入序列的数量?

编译多个反向排列

Python on OSX : force py. 测试不使用系统版本的python