【问题标题】:How to make a new list from list of values of occurrences and value? [closed]如何从出现值和值的列表中创建一个新列表? [关闭]
【发布时间】:2021-12-12 10:16:47
【问题描述】:

我有 2 个列表,其中一个包含浮点值,第二个包含第一个列表中值的出现次数。我怎样才能创建一个新的列表,它有值次出现?

values = [10.5,20.2, 50.0]
occ = [3,5,1]

结果应该是[10.5,10.5,10.5,20.2,20.2,20.2,20.2,20.2,50.0]

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 看看zip 并使用带有两个for循环的列表理解? [v for v, c in zip(values, occ) for _ in range(c)]
  • 我尝试过使用双循环,但因为我在列表中循环,我得到的值是 3 倍(occ 的长度)
  • @DD 您可以将您尝试过的内容发布到问题本身。您可以从这里edit 提问。
  • 如果您不发布代码,我们无法为您提供您的代码:minimal reproducible example

标签: python list loops


【解决方案1】:
output =[]
for i in range(len(values)):
    for j in range(occ[i]):
        output.append(values[i])
print(output)

[10.5, 10.5, 10.5, 20.2, 20.2, 20.2, 20.2, 20.2, 50.0]

【讨论】:

    【解决方案2】:

    pythonic 方式将在列表理解中使用zip,如多次演示的那样。

    您可以简单的循环和enumerate() 达到类似的效果 - 但它会导致更多的代码行:

    values = [10.5,20.2, 50.0]
    occ = [3, 5, 1]
    
    result = []
    
    # enumerate returns a tuple: position, value 
    # of all values of the iterable you give it
    for index, times in enumerate(occ):
        # use the index to get the value from the other list you 
        # have and append it multiple times
        for _ in range(times):
            result.append(values[index])
    
    print(result)
    

    输出:

    [10.5, 10.5, 10.5, 20.2, 20.2, 20.2, 20.2, 20.2, 50.0]
    

    enumerate() documentation

    【讨论】:

      【解决方案3】:

      你可以用这个:

      sum(([v]*m for v, m in zip(values, occ)), [])
      

      不推荐用于大型列表。其实根本不推荐。

      【讨论】:

        【解决方案4】:

        您可以将zip 与嵌套的list 理解一起使用:

        values = [10.5,20.2, 50.0]
        occ = [3,5,1]
        
        result = [x for x, y in zip(values, occ) for _ in range(y)]
        

        或者,不使用range

        result = [elem for x, y in zip(values, occ) for elem in [x] * y]
        

        输出:

        [10.5, 10.5, 10.5, 20.2, 20.2, 20.2, 20.2, 20.2, 50.0]
        

        【讨论】:

          【解决方案5】:

          您可以使用zip 并行迭代两个列表,然后重复项目数次并将其添加到结果列表中,如下所示:

          result = []
          for v,m in zip(values,occ):
              result.extend([v for _ in range(m)])
                            
          result
          [10.5, 10.5, 10.5, 20.2, 20.2, 20.2, 20.2, 20.2, 50.0]
          

          或者评论中建议的列表理解:

          [v for v, c in zip(values, occ) for _ in range(c)]
          [10.5, 10.5, 10.5, 20.2, 20.2, 20.2, 20.2, 20.2, 50.0]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-17
            • 1970-01-01
            • 2021-09-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-18
            相关资源
            最近更新 更多