我正在尝试创建一个列表(例如 B
),该列表仅在另一个列表(例如 A
)的值存在差异时才递增,例如:
[1,1,2,2,4,4]
到 [0,0,1,1,2,2]
或
[1,1,1,1,4,4,4,4]
到 [0,0,0,0,1,1,1,1]
等
下面的代码是这样做的:
boxes=[1,1,1,1,4,4,4,4]
positions=[0]
position=0
for psn,box in list(enumerate(boxes))[:-1]:
if boxes[psn+1]-box ==0:
increment=0
else:
increment=1
position=position+increment
positions.append(position)
print(positions)
任何人都可以建议使用列表推导来做到这一点(最好使用 lambda
函数)吗?
最佳答案
下面是使用 numpy
的方法:
a = [1,1,2,2,4,4]
[0] + np.cumsum(np.clip(np.diff(a), 0, 1)).tolist()
[0, 0, 1, 1, 2, 2]
或者另一个例子:
a = [1,1,1,1,4,4,4,4]
[0] + np.cumsum(np.clip(np.diff(a), 0, 1)).tolist()
[0, 0, 0, 0, 1, 1, 1, 1]
详情
a = [1,1,2,2,4,4]
用np.diff
得到数组的第一个差
np.diff(a)
array([0, 1, 0, 2, 0])
并使用 np.clip
限制 0
和 1
之间的值:
np.clip(np.diff(a), 0, 1)
array([0, 1, 0, 1, 0])
最后取np.cumsum
并在开头添加一个 0
,因为差异将为您提供一个长度为 n-1
的数组:
[0] + np.cumsum(np.clip(np.diff(a), 0, 1)).tolist()
[0, 0, 1, 1, 2, 2]
关于python - 将数组值的增量减少到 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54112640/