对于可变长度字符串列表,如何创建所有组合

2024-05-19 07:21:32 发布

您现在位置:Python中文网/ 问答频道 /正文

在python3中,我有一个可变长度的列表,其中列表的每个元素都是一个可变长度的字符串。像这样的东西

['TO', 'G', 'ZDO', 'DEO', 'SGT', 'D', 'Z', 'FT', 'OV']

我想迭代所有可能的单词组合,其中组成单词的字母来自列表中的字符串,单词的长度与列表的长度相同。所以像这样的事

^{pr2}$

我很难想出一个n大小列表的通用解决方案。在


Tags: to字符串元素列表字母解决方案单词python3
3条回答
>>> (''.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模块创建所需长度的排列。 将所有的工作组合成一个字符串,并在置换函数中使用它

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)

输出:

^{pr2}$

编辑

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  -

相关问题 更多 >

    热门问题