我在不同的行上有多个字符串,我希望在不改变顺序的情况下获得所有可能的排列:
例如:
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'
答案 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']