2024-05-19 07:21:32 发布
网友
在python3中,我有一个可变长度的列表,其中列表的每个元素都是一个可变长度的字符串。像这样的东西
['TO', 'G', 'ZDO', 'DEO', 'SGT', 'D', 'Z', 'FT', 'OV']
我想迭代所有可能的单词组合,其中组成单词的字母来自列表中的字符串,单词的长度与列表的长度相同。所以像这样的事
我很难想出一个n大小列表的通用解决方案。在
>>> (''.join(s) for s in itertools.product(*['TO', 'G', 'ZDO', 'DEO', 'SGT', 'D', 'Z', 'FT', 'OV'])) <generator object <genexpr> at 0x7f2a46468f00> >>> # to demonstrate: ... >>> list(itertools.islice((''.join(s) for s in itertools.product(*['TO', 'G', 'ZDO', 'DEO', 'SGT', 'D', 'Z', 'FT', 'OV'])), 3)) ['TGZDSDZFO', 'TGZDSDZFV', 'TGZDSDZTO']
您可以使用itertools模块创建所需长度的排列。 将所有的工作组合成一个字符串,并在置换函数中使用它
itertools
lst = ['TO', 'G', 'ZDO', 'DEO', 'SGT', 'D', 'Z', 'FT', 'OV'] length = len(lst) combined = ''.join(lst) all_perms = itertools.permutations(combined, length) #this will give you something like [('T', 'O', ...), (...),] print ([''.join(x) for x in all_perms])
正如其他人所说,itertools可能是解决这个问题的最简单/最简单的方法。但是,如果您希望编写自己的算法(即重新实现itertools在幕后的作用),那么请看一下:
def allPerms(L, sofar=''): if not L: print(sofar) else: for char in L[0]: allPerms(L[1:], sofar+char)
输出:
编辑:
As @njzk2 points out,python3的yield from在使输出可用方面做了出色的工作:
def allPerms(L, sofar=''): if not L: yield sofar else: for char in L[0]: yield from allPerms(L[1:], sofar+char)
In [118]: for i in allPerms(L): print(i) TGZDSDZFO TGZDSDZFV TGZDSDZTO TGZDSDZTV TGZDGDZFO TGZDGDZFV TGZDGDZTO TGZDGDZTV TGZDTDZFO TGZDTDZFV TGZDTDZTO TGZDTDZTV TGZESDZFO TGZESDZFV TGZESDZTO TGZESDZTV TGZEGDZFO TGZEGDZFV TGZEGDZTO TGZEGDZTV TGZETDZFO TGZETDZFV TGZETDZTO - truncated -
您可以使用
itertools
模块创建所需长度的排列。 将所有的工作组合成一个字符串,并在置换函数中使用它正如其他人所说,
itertools
可能是解决这个问题的最简单/最简单的方法。但是,如果您希望编写自己的算法(即重新实现itertools
在幕后的作用),那么请看一下:输出:
^{pr2}$编辑:
As @njzk2 points out,python3的yield from在使输出可用方面做了出色的工作:
输出:
相关问题 更多 >
编程相关推荐