【问题标题】:most efficient way to modify each element in multiple lists together?一起修改多个列表中的每个元素的最有效方法?
【发布时间】:2020-04-14 08:42:01
【问题描述】:

假设我有 3 个列表

a = [1.12, 2.23, 3.34]
b = [2.12, 3.23, 4.34]
c = [3.12, 4.23, 5.34]

我的目标是将数字四舍五入到小数点后 1 位。所以我有这个自定义功能:

import math
def round_down(n, decimals=0):
    multiplier = 10 ** decimals
    return math.floor(n * multiplier) / multiplier

请问对每个对象中的每个元素进行操作的最有效方法是什么?在这个简单的示例中,我可以为 3 个对象中的每一个编写一个循环,例如:

for i in np.range(len(a)):
    a[i] = round_down(a[i], decimals=1)

但是,在我的工作中,我还有很多不同长度的列表,我真的不想一一编码。有没有办法遍历对象列表?还是并行处理?

【问题讨论】:

  • 你可以使用map()
  • 可以使用内置range时,无需使用np.arange
  • 你最好的选择可能是只使用 NumPy。这些列表都是一维/平面的吗?

标签: python python-3.x


【解决方案1】:
combine_array = [a, b, c]
for p in combine_array:
    for i in np.range(len(p)):
        p[i] = round_down(p[i], decimals=1)

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。我建议您查看 SO 的 official How to Answer article 以及来自 Jon Skeet 的综合 blog post
【解决方案2】:

就像您使用 for 循环来避免对每个元素进行编码一样,使用 for 循环来迭代所有列表:

my_lists = [a, b, c]
for l in my_lists:
    for i in np.range(len(l)):
        l[i] = round_down(l[i], decimals=1)

【讨论】:

  • 我会把它放在一个双重列表理解中以获得更好的速度。
  • @Guimout
  • 小错字——应该是 np.arange 而不是 np.range(否则 AttributeError: module 'numpy' has no attribute 'range')。但不知道为什么你不使用内置的范围函数,因为它应该是faster in this particular case
  • @wjandrea 类似my_rounded_lists = [[round_down(x, 1) for x in lst] for lst in my_lists] 我相信。我不能从这里测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2016-02-11
相关资源
最近更新 更多