给出多个字符串的所有可能字符串

时间:2017-08-01 04:01:34

标签: python

我在不同的行上有多个字符串,我希望在不改变顺序的情况下获得所有可能的排列:

例如:

er r er
er er r

会给我:

er r er
er er r
er r r
er er er

有没有办法做到这一点是python?如果这是重复,请告知,但我找不到。

这与Finding all possible permutations of a given string in python之类的问题不同,后者只使用了一个字符串

更新[仍无效]

import itertools

with open(in_file) as f:
    lis = list(f) 

print (lis)
print([' '.join(x) for x in itertools.product(*map(set, zip(*map(str.split, lis))))])

[错误]

[['er', 'r', 'er'], ['er', 'er', 'r']]
Traceback (most recent call last):
File "test.py", line 37, in <module>
print([' '.join(x) for x in itertools.product(*map(set, zip(*map(str.split, S))))])
TypeError: descriptor 'split' requires a 'str' object but received a 'list'

1 个答案:

答案 0 :(得分:2)

您可以zip对这些字符串进行拆分,并采取结果product,例如:

>>> import itertools as it
>>> s1, s2 = 'er r er', 'er er r'
>>> {' '.join(x) for x in it.product(*zip(s1.split(), s2.split()))}
{'er er er', 'er er r', 'er r er', 'er r r'}

您可以获得重复项,构造为set理解。

针对任意数量的字符串进行了更新:

>>> import itertools as it
>>> ss = ['er r er', 'er er r', 'ar er r']
>>> {' '.join(x) for x in it.product(*zip(*map(str.split, ss)))}
{'ar er er', 'ar er r', 'ar r er', 'ar r r', 'er er er', 'er er r', 'er r er', 'er r r'}

注意:您也可以将set应用于product的参数以删除重复项,并且可能会更快,具体取决于字符串的重叠,例如:

>>> [' '.join(x) for x in it.product(*map(set, zip(*map(str.split, ss))))]
['er r r', 'er r er', 'er er r', 'er er er', 'ar r r', 'ar r er', 'ar er r', 'ar er er']

从文件类型对象中读取:

>>> with open(in_file) as f:
...     lis = list(f)
>>> print([' '.join(x) for x in it.product(*map(set, zip(*map(str.split, lis))))])
['er r r', 'er r er', 'er er r', 'er er er']

或更紧凑:

>>> with open(in_file) as f:
...     print([' '.join(x) for x in it.product(*map(set, zip(*map(str.split, f))))])
['er r r', 'er r er', 'er er r', 'er er er']