我有两个长度相等的列表。 我将list1增加一定数量,但每个条目都必须由list2中的相应条目来修改。
我正在做的是:
for ii in range(len(list1)):
list1[ii] = (list1[ii]+val) % list2[ii]
有没有更好的方法(也许使用numpy)?我找不到。这些列表很长,因此性能是一个问题。
答案 0 :(得分:2)
您可以使用enumerate
和zip
减少所涉及的索引编制数量:
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
所有三个结果相同。 first和second的文档在这里。 Shadow Ranger在评论中建议了第三种方法。