【问题标题】:create strings using combinations of list items使用列表项的组合创建字符串
【发布时间】:2020-02-27 16:00:19
【问题描述】:

我喜欢用以下方式创建字符串: 该字符串有一个前缀、一个主要部分和一个后缀,所有这些都由分隔符分隔。 前缀、后缀和分隔符存储在列表中

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?还是我必须遍历所有列表?

【问题讨论】:

  • 你能添加你试过的代码吗
  • 我不得不提一件事:我也需要 pre1_pre2_main_suf1_suf2 形式的字符串。所以前缀组合+main pat+后缀组合
  • 现在这是一个非常不同的问题......

标签: python python-3.x


【解决方案1】:
import itertools
for pre, suf, sep in itertools.product(ListOfPrefixes, ListOfSuffixes, ListOfDelims):
    print(sep.join([pre, MainPart, suf])

这是你想要的吗?

【讨论】:

  • 就是这样:如果我定义 .product(ListOfPrefixex,ListOfPrefixes,ListOfSuffixes,ListOfSuffixes,ListOfDelims) 我会得到所有需要的组合!
  • 这种情况下,当然需要相应地改成pre1, pre2, suf1, suf2
【解决方案2】:

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

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

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

【讨论】:

  • 我喜欢sep.join 部分,非常好。
【解决方案3】:

你想要一个笛卡尔积。

from itertools import product

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

这个是印刷精美

['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']

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

【讨论】:

    【解决方案4】:
    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))
    

    输出:

    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
    

    【讨论】:

      【解决方案5】:

      您可以使用嵌套循环并遍历每个前缀、后缀和分隔符,然后像这样连接。

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

      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
      

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

      combinationList = list(dict.fromkeys(combinationList))
      

      这样做会将其转换为字典,然后返回列表,删除不需要的重复项(如果有的话)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-07
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-14
        • 1970-01-01
        相关资源
        最近更新 更多