Python 获取给定多个字符串的所有可能字符串
我在不同的行上有多个字符串,我希望在不改变顺序的情况下获得所有可能的排列: 例如:Python 获取给定多个字符串的所有可能字符串,python,Python,我在不同的行上有多个字符串,我希望在不改变顺序的情况下获得所有可能的排列: 例如: er r er er er r 这将给我: er r er er er r er r r er er er 在python中有没有一种方法可以做到这一点?如果这是一个重复,请告知,但我无法找到一个 这与仅使用一个字符串的问题不同 更新[仍然不工作] import itertools with open(in_file) as f: lis = list(f) print (lis) print(
er r er
er er r
这将给我:
er r er
er er r
er r r
er er er
在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'
回溯(最近一次呼叫最后一次):
文件“test.py”,第37行,在
打印([''.join(x)for x in itertools.product(*map(set,zip(*map(str.split,S)))))
TypeError:描述符“split”需要一个“str”对象,但收到一个“list”
您可以zip
拆分这些字符串,并获取cartesion产品,例如:
>>> 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'}
你可以得到这样的副本,构造成一个集
为任意数量的字符串更新:
>>> 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'}
注意:您还可以将集合
应用于产品
的参数,以删除重复项,并且根据字符串的重叠情况,这可能会更快,例如:
>>> [' '.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']
可能是@Kallz的副本,但这一个只有一个字符串,我可以这样做。。。问题是获取多个字符串之间的组合。能否在\u文件的中显示数据?注意:您正在split()
ing两次,lis=list(f)
就足够了。当然,您可以直接将f
放入map()
中(并将print
移动到with
子句中)。或者你可以去掉map()
,只使用zip(*lis)
@AChampion文件中的内容与我的示例完全相同那么为什么要拆分两次呢?我想要一个不适用于两个字符串的示例,因为我可以有更多字符串。我会更新我的问题。请更新,因为这需要非凡的推理才能从你的问题中得出结论。注意:对于任意数量的字符串,这很容易更新。我得到的zip()
是一个内置函数,它接受多个列表并返回所有第一个元素、所有第二个元素等的元组的迭代器(或list
py2)。我的想法是这样的:print('.join)(x代表x,在itertools.product中)我将字符串添加到一个列表中,希望能有所帮助