使用列表项的组合创建字符串

问题描述 投票:0回答:5

我喜欢以以下方式创建字符串:该字符串有一个前缀,一个主要部分和一个后缀,均由定界符分隔。前缀,后缀和定界符存储在列表中

ListOfPrefixes=['pre1','pre2']
ListOfSuffixes=['suf1','suf2','suf3']
ListOfDelims=['-','_','']
MainPart = 'main'

现在我喜欢使用列表项的组合来创建字符串,例如

pre1-main-suf1
pre2-main-suf1
pre1-main-suf2
...
pre2_main_suf2
...
pre1mainsuf3

[我试图使用itertools来获取列表项的组合,但是我没有找到正确的代码来获取组合。

是否有一种简单的方法,或者我必须合并几个itertools.combinations?还是我必须遍历所有列表?

python python-3.x
5个回答
3
投票
import itertools
for pre, suf, sep in itertools.product(ListOfPrefixes, ListOfSuffixes, ListOfDelims):
    print(sep.join([pre, MainPart, suf])

这就是您想要的吗?


1
投票

combinations返回n个长度的组合,而无需从单个序列中替换,例如(0,1,2,3,4)中的所有对都是(0,1),(0,2),(0,3),...,(3,4)。

这根本不是您想要的,您想要的是itertools.product,给它提供任意数量的可迭代对象,它返回该大小的元组,并从每个可迭代对象中选择一项(枚举所有可能性)。

itertools.product

0
投票

您需要笛卡尔积。

def the_thing(main_part, prefixes, delimiters, suffixes):
    for pre, sep, suf in product(prefixes, delimiters, suffixes):
        print(sep.join([pre, main_part, suf])

打印精美的是

from itertools import product

[f"{p}{d}{MainPart}{d}{s}" for d, s, p in
 product(ListOfDelims, ListOfSuffixes, ListOfPrefixes)]

笛卡尔积的工作方式类似于嵌套循环。您不希望同一字符串中的定界符有所不同,即使您使用了两次,所以我在f字符串中而不是在产品中重复它们。


0
投票
['pre1-main-suf1',
 'pre2-main-suf1',
 'pre1-main-suf2',
 'pre2-main-suf2',
 'pre1-main-suf3',
 'pre2-main-suf3',
 'pre1_main_suf1',
 'pre2_main_suf1',
 'pre1_main_suf2',
 'pre2_main_suf2',
 'pre1_main_suf3',
 'pre2_main_suf3',
 'pre1mainsuf1',
 'pre2mainsuf1',
 'pre1mainsuf2',
 'pre2mainsuf2',
 'pre1mainsuf3',
 'pre2mainsuf3']

输出:

import itertools

ListOfPrefixes=['pre1','pre2']
MainPart = ['main']
ListOfSuffixes=['suf1','suf2','suf3']
ListOfDelims=['-','_','']


FullList = [ListOfPrefixes, MainPart, ListOfSuffixes]

for x in list(itertools.product(*FullList)):
    for i in range(len(ListOfDelims)):
        print(ListOfDelims[i].join(x))

0
投票

您可以使用嵌套循环并遍历每个前缀,后缀和定界符,然后像这样进行串联。

编辑:如果要从更新的注释中获得额外的组合,则可以在循环中添加更多的嵌套,并添加条件以检查第一个和第二个前缀或第一个和第二个后缀是否相同:

pre1-main-suf1
pre1_main_suf1
pre1mainsuf1
pre1-main-suf2
pre1_main_suf2
pre1mainsuf2
pre1-main-suf3
pre1_main_suf3
pre1mainsuf3
pre2-main-suf1
pre2_main_suf1
pre2mainsuf1
pre2-main-suf2
pre2_main_suf2
pre2mainsuf2
pre2-main-suf3
pre2_main_suf3
pre2mainsuf3

输出:

ListOfPrefixes=['pre1','pre2']
ListOfSuffixes=['suf1','suf2','suf3']
ListOfDelims=['-','_','']
MainPart = 'main'


for prefix in ListOfPrefixes:
    for suffix in ListOfSuffixes:
        for delimiter in ListOfDelims:
            for prefix2 in ListOfPrefixes:
                for suffix2 in ListOfSuffixes:
                    if prefix != prefix2 and suffix != suffix2:
                        print(prefix + delimiter + prefix2 + delimiter + MainPart + delimiter + suffix + delimiter + suffix2)

#and a second nested loop for the rest:

for prefix in ListOfPrefixes:
    for suffix in ListOfSuffixes:
        for delimiter in ListOfDelims:
            print(prefix + delimiter + MainPart + delimiter + suffix)

在执行此方法时,将组合存储在列表中很有用。如果组合列表中有多余的数据,则可以使用此技巧:

pre1-pre2-main-suf1-suf2
pre1-pre2-main-suf1-suf3
pre1_pre2_main_suf1_suf2
pre1_pre2_main_suf1_suf3
pre1pre2mainsuf1suf2
pre1pre2mainsuf1suf3
pre1-pre2-main-suf2-suf1
pre1-pre2-main-suf2-suf3
pre1_pre2_main_suf2_suf1
pre1_pre2_main_suf2_suf3
pre1pre2mainsuf2suf1
pre1pre2mainsuf2suf3
pre1-pre2-main-suf3-suf1
pre1-pre2-main-suf3-suf2
pre1_pre2_main_suf3_suf1
pre1_pre2_main_suf3_suf2
pre1pre2mainsuf3suf1
pre1pre2mainsuf3suf2
pre2-pre1-main-suf1-suf2
pre2-pre1-main-suf1-suf3
pre2_pre1_main_suf1_suf2
pre2_pre1_main_suf1_suf3
pre2pre1mainsuf1suf2
pre2pre1mainsuf1suf3
pre2-pre1-main-suf2-suf1
pre2-pre1-main-suf2-suf3
pre2_pre1_main_suf2_suf1
pre2_pre1_main_suf2_suf3
pre2pre1mainsuf2suf1
pre2pre1mainsuf2suf3
pre2-pre1-main-suf3-suf1
pre2-pre1-main-suf3-suf2
pre2_pre1_main_suf3_suf1
pre2_pre1_main_suf3_suf2
pre2pre1mainsuf3suf1
pre2pre1mainsuf3suf2
pre1-main-suf1
pre1_main_suf1
pre1mainsuf1
pre1-main-suf2
pre1_main_suf2
pre1mainsuf2
pre1-main-suf3
pre1_main_suf3
pre1mainsuf3
pre2-main-suf1
pre2_main_suf1
pre2mainsuf1
pre2-main-suf2
pre2_main_suf2
pre2mainsuf2
pre2-main-suf3
pre2_main_suf3
pre2mainsuf3

执行此操作会将其转换为字典,然后返回到列表,删除不需要的重复项(如果您有的话)。

© www.soinside.com 2019 - 2024. All rights reserved.