将python列表增加数量mod x_i,其中x_i取决于位置

时间:2019-02-10 02:01:14

标签: python python-3.x numpy modulo

我有两个长度相等的列表。 我将list1增加一定数量,但每个条目都必须由list2中的相应条目来修改。

我正在做的是:

for ii in range(len(list1)):
    list1[ii] = (list1[ii]+val) % list2[ii]

有没有更好的方法(也许使用numpy)?我找不到。这些列表很长,因此性能是一个问题。

2 个答案:

答案 0 :(得分:2)

您可以使用enumeratezip减少所涉及的索引编制数量:

for ii, (a, b) in enumerate(zip(list1, list2)):
    list1[ii] = (a + val) % b

也就是说,您最好只使用列表理解来避免完全使用索引,因此您可以删除enumerate并仅使用zip,这样可以使代码看起来更简洁(以及更快的启动代码):

# Creates a new list and rebinds list1 to it:
list1 = [(a + val) % b for a, b in zip(list1, list2)]

# Or if list1 *must* be modified in place, slice assignment can do that:
list1[:] = [(a + val) % b for a, b in zip(list1, list2)]

请注意,在两个示例中,我都将您的list重命名为list1,因为在list构造函数中加上阴影是很糟糕的想法。

答案 1 :(得分:1)

可以使用numpy

import numpy as np
numpy_list1 = np.array(list1)
numpy_list2 = np.array(list2)

mod_values1 = np.mod(numpy_list1 + val, numpy_list2) 
mod_values2 = np.remainder(numpy_list1 + val, numpy_list2)
mod_values3 = (numpy_list1 + val) % numpy_list2

所有三个结果相同。 firstsecond的文档在这里。 Shadow Ranger在评论中建议了第三种方法。