【问题标题】:Create array containing list of lists of n repeated items in Python在Python中创建包含n个重复项列表的数组
【发布时间】:2019-02-16 16:03:49
【问题描述】:

我试图找到一种更快的方法来创建这样的列表:

import numpy as np
values = [0,1,2]
repeat = [3,4,2]
list = np.empty(0, dtype=int)
for i in range(len(values)):
    list = np.append(list, np.full(repeat[i], values[i]))
print list

返回

[0 0 0 1 1 1 1 2 2]

有什么想法吗?谢谢

【问题讨论】:

  • 请说明您的应用程序需要多快。

标签: python list


【解决方案1】:
In [8]: [i for i, j in zip(values, repeat) for _ in range(j)]
Out[8]: [0, 0, 0, 1, 1, 1, 1, 2, 2]

在这里,我们压缩值并与 zip 一起重复以在它们之间建立一一对应关系(如 [(0, 3), (1, 4), (2, 2)])。现在,在列表理解中,我插入 i 或值并将它们循环到 j 的范围内以重复它第 j 次。

【讨论】:

  • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和文档链接。如果没有围绕它的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案。
【解决方案2】:

我会这样做:

a=[1,2,3]
b=[2,4,3]
x=[[y]*cnt_b for cnt_b,y in zip(b,a)]

输出:

[[1,1],[2,2,2,2],[3,3,3]]

【讨论】:

    【解决方案3】:

    你可以试试这个。将值列表乘以每对值和长度的长度。
    您将获得列表列表

    L = [[i]*j for i, j in zip(values, repeat)] 
    print(L)
    

    返回

    [[0, 0, 0], [1, 1, 1, 1], [2, 2]]
    

    比做一个简单的列表

    flat_L = [item for sublist in L for item in sublist] 
    print(flat_L)
    [0, 0, 0, 1, 1, 1, 1, 2, 2]
    

    【讨论】:

      【解决方案4】:

      使用原生 python 列表而不是 numpy 数组可以节省大量时间。当我使用timeit 模块运行您的代码时,耗时 16.87 秒。以下代码耗时 0.87。

      list = []
      for val, rep in zip(values, repeat):
          list.extend([val]*rep)
      

      如果您随后使用 list = np.array(list) 将列表转换为 numpy 数组,则该时间最多为 2.09 秒。

      当然,因为numpy is optimized for large amounts of data,这可能不适用于包含大量重复的非常长的值列表。在这种情况下,一种替代方法是同时为您分配内存,而不是不断地延长数组(我相信covertly causes a copy to made,这很慢)。下面的示例在 4.44 秒内完成。

      list = np.empty(sum(repeat), dtype=int) #allocate the full length
      i=0 #start the index at 0
      for val, rep in zip (values, repeat):
          list[i:i+rep] = [val]*rep #replace the slice
          i+=rep #update the index
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多