【问题标题】:how to get every possible sum of list cases如何获得所有可能的列表案例总和
【发布时间】:2017-09-03 21:23:54
【问题描述】:

你好,我刚开始学习python。

我想在列表中创建数据的每个案例

if [a,b,c,d,e]

[aa, 'ab', 'ac', 'ad', 'ae', 'ba', 'bb', 'bc', 'bd', 'be'] and so on

但我不知道该怎么做。

这是我能做到的:

def number_of_cases(list_data):

    mix_data=[]
    list_data = list(map(str,list_data))
    for data in list_data:
        mix_data.append(data+list_data[0])
        mix_data.append(data+list_data[1])
        mix_data.append(data+list_data[2])

我不能继续做list[0 1 2 3 4],因为我不知道这个列表会有多长......

【问题讨论】:

    标签: python list for-loop indexing while-loop


    【解决方案1】:

    考虑使用itertools.product?给定两个列表,它将创建一个列表中的项目和另一个列表中的项目的所有成对组合,作为元组序列。然后将每个元组粘合在一起。

    from itertools import product
    data = ['a', 'b', 'c', 'd']
    pairs = [''.join(x) for x in product(data, data)]
    print(pairs)
    

    【讨论】:

      【解决方案2】:

      @AlexL 的 answerproduct 是要走的路。这是您的代码的修改版本,具有所需的结果:

      mix_data=[]
      list_data = ['a', 'b', 'c', 'd', 'e']
      list_data = list(map(str,list_data))
      for data1 in list_data:
          for data2 in list_data:
              mix_data.append(data1+data2)
      print(mix_data)
      

      它输出:

      ['aa', 'ab', 'ac', 'ad', 'ae', 'ba', 'bb', 'bc', 'bd', 'be', 'ca', 'cb','cc','cd','ce','da','db','dc','dd','de','ea','eb', 'ec', 'ed', 'ee']

      【讨论】:

        【解决方案3】:

        您可以像@Alex L 所说的那样使用 itertools,也可以使用这两个简单的循环。

        list1 = ['a', 'b', 'c', 'd']
        nlist=[]
        for x in list1:      
         for y in list1:
          nlist+=[x+y]
        print(nlist)  
        

        【讨论】:

        • 谢谢,我不是在寻找导入工具,我需要像这样的简单表格
        【解决方案4】:

        或者你可以做一个平面列表理解:

        data = list('abcd')
        pairs = [x+y for x in data for y in data]
        pairs
        # ['aa', 'ab', 'ac', 'ad', 'ba', 'bb', 'bc', 'bd', 'ca', 'cb', 'cc', 'cd', 'da', 'db', 'dc', 'dd']
        

        顺便说一句,在这个特殊的例子中,甚至没有必要先列出一个列表

        pairs = [x+y for x in 'abcd' for y in 'abcd']
        

        也可以。

        【讨论】:

          【解决方案5】:

          我的第一个建议是不正确的,如下所述。这个答案仍然正确。

          使用列表推导和 f-strings(f-strings 仅在 python 3.6 及更高版本中)来做到这一点是一个可爱而简洁的方法。例如:

          chars = 'abcde'
          pairs = ['{x}{y}' for x in chars for y in chars]
          

          如果您没有 f 字符串,则等效项如下:

          chars = 'abcde'
          pairs = ([f'%s%s' % (x, y) for x in chars for y in chars])
          

          >>>print(pairs) ['aa', 'ab', 'ac', 'ad', 'ae', 'ba', 'bb', 'bc', 'bd', 'be', 'ca', 'cb', 'cc', 'cd', 'ce', 'da', 'db', 'dc', 'dd', 'de', 'ea', 'eb', 'ec', 'ed', 'ee']

          【讨论】:

          • 你看这里的其他答案了吗?如果是这样,您不奇怪为什么itertools.productitertools.combinations_with_replacement 都应该给出相同的结果吗?提示:尝试运行您的第二个建议并将其真实输出与您发布的进行比较;-)
          • 啊,你是对的。我们谈论的是排列而不是组合。提示:说“提示:”是非常被动的攻击性;)
          • 是吗?在那种情况下,我道歉。
          猜你喜欢
          • 2018-05-09
          • 1970-01-01
          • 2014-06-16
          • 2010-10-02
          • 1970-01-01
          • 2016-06-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多