【问题标题】:Creating list using a frequency list in Python [duplicate]在Python中使用频率列表创建列表[重复]
【发布时间】:2018-08-29 18:55:50
【问题描述】:
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]
output_age = [19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]

我们如何创建一个新列表,它可以根据另一个列表多次添加一个列表中的项目?

谢谢

【问题讨论】:

  • “依赖于另一个列表的次数”确切是什么意思?项目的数量或它们的值或?

标签: python python-3.x


【解决方案1】:

使用列表理解:

output_age = [i for l in ([a]*f for a, f in zip(age, frequency)) for i in l]
#[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]

为什么?

我们首先将zip 放在一起agefrequency 列表,以便我们可以一致地迭代它们。因此:

for a, f in zip(age, frequency):
    print(a, f)

给予:

19 2
20 1
21 1
22 3
23 2
24 1
25 1

然后我们要重复每个元素a,重复次数与f 确定的一样多。这可以通过创建一个列表并将其相乘来完成。就像:

[4] * 3
#[4, 4, 4]

然后我们需要解压这些值,因此我们将这个表达式包装在一个生成器中(用括号表示)并对其进行迭代。这会使列表变平。注意有alternative ways实现这个(比如使用itertools.chain.from_iterable)。


另一种方法是重复数字 a,通过迭代 range 对象而不是乘以列表来获得重复次数。

这个方法看起来像:

output_age = [a for a, f in zip(age, frequency) for _ in range(f)]
#[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]

【讨论】:

  • 谢谢,但这不太正确,这导致 output_age = [[19, 19], [20], [21], [22, 22, 22], [23, 23 ], [24], [25]]
  • @jr100 再看,我更正了
【解决方案2】:

使用itertoolszip

例如:

from itertools import chain
age = [19, 20, 21, 22, 23, 24, 25]
frequency = [2, 1, 1, 3, 2, 1, 1]

print( list(chain.from_iterable([[i] * v for i,v in zip(age, frequency)])) )

输出:

[19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
  • 注意: chain.from_iterable 以展平列表。

【讨论】:

    【解决方案3】:

    这是使用ziprange 的解决方案

    >>> age = [19, 20, 21, 22, 23, 24, 25]
    >>> frequency = [2, 1, 1, 3, 2, 1, 1]
    >>> [a for a,f in zip(age, frequency) for _ in range(f)]
    [19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
    

    【讨论】:

      【解决方案4】:

      最简单易懂的方式;

      age = [19, 20, 21, 22, 23, 24, 25]
      frequency = [2, 1, 1, 3, 2, 1, 1]
      
      output_age = []
      for age, freq in zip(age, frequency):
          for _ in range(freq):
              output_age.append(age)
      

      【讨论】:

        【解决方案5】:

        您也可以使用sum 函数执行此操作,但不建议将其用于生产代码:

        age = [19, 20, 21, 22, 23, 24, 25]
        frequency = [2, 1, 1, 3, 2, 1, 1]
        output_age = sum([[age[i]] * frequency[i] for i in range(len(age))],[])
        print(output_age)
        

        输出:

        [19, 19, 20, 21, 22, 22, 22, 23, 23, 24, 25]
        

        【讨论】:

          【解决方案6】:

          你需要:

          import functools
          output_age = functools.reduce(lambda x, y:x+y, [[age[i]] * frequency[i] for i in range(len(age))])
          

          【讨论】:

            【解决方案7】:
            age = [19, 20, 21, 22, 23, 24, 25]
            frequency = [2, 1, 1, 3, 2, 1, 1]
            new_list = zip(age, frequency)
            output_age=[]
            for x,y in new_list:
              for i in range(y):
                output_age.append(x)
            

            输出:

            [19、19、20、21、22、22、22、23、23、24、25]

            【讨论】:

              猜你喜欢
              • 2019-09-17
              • 1970-01-01
              • 1970-01-01
              • 2016-05-20
              • 1970-01-01
              • 1970-01-01
              • 2013-05-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多