python 在列表中查找重复对象
python find duplicate objects in a list
我有一个列表
l = [object0, object1, object2, object3, object4....object499]
最大长度不超过 500
所有对象都具有属性 x、y、z、a
如果 object.x 中有重复项,我必须将 object.y 修改为:
if object9.x == object10.x:
object9.y = object9.z * object9.a/1000
object10.y = object10.y - object9.z * object9.a/1000
保证重复项在连续的对象中。
可能有超过 2 个重复,例如
object12.x == object13.x == object14.x
因此修改将根据修改后的第二个副本的值以与第三个副本相同的方式进行。
我已经编写了一个循环来执行此操作,但在考虑是否有任何 pythonic/faster 方法来执行此操作。
我正在使用 python3.7
编辑:
tag = None
for i, o in enumerate(l):
if tag is None:
x_a = o.x
elif x_a == o.x #duplicate found
temp = o.y
c_over = 0
c_value = o[i-1].z * o[i-1].a/1000
if c_value < o[i-1].y:
o[i-1].y = c_value
c_over = temp - c_value #carry over value
o[i] = c_over # either zero of carry over value
x_a = o.x
由于您正在修改对象的属性,因此您可以通过 zip
:
遍历连续的对
for a, b in zip(l, l[1:]):
if a.x == b.x:
a.y = a.z * a.a/1000
b.y = b.y - a.y
绝对是这里的必经之路。我没有对此进行任何测试,但它应该可以解决问题
import itertools
import operator
l = [object0, object1, object2, object3, object4]
for k, g in itertools.groupby(l, key=operator.attrgetter('x')):
l = list(g)
for o1, o2, in zip(l, l[1:]): # Note 1, 2
o1.y = o1.z * o1.a / 1000
o2.y = o2.z - o1.y
备注:
- 假设您从头到尾修改组。如果你想反过来做,你必须用
zip(l[len(l)-2::-1], l[::-1])
替换 zip(l, l[1:])
- 感谢@ShadowRanger 指出不需要
if
检查(由 zip
处理)
我有一个列表
l = [object0, object1, object2, object3, object4....object499]
最大长度不超过 500
所有对象都具有属性 x、y、z、a
如果 object.x 中有重复项,我必须将 object.y 修改为:
if object9.x == object10.x:
object9.y = object9.z * object9.a/1000
object10.y = object10.y - object9.z * object9.a/1000
保证重复项在连续的对象中。
可能有超过 2 个重复,例如
object12.x == object13.x == object14.x
因此修改将根据修改后的第二个副本的值以与第三个副本相同的方式进行。
我已经编写了一个循环来执行此操作,但在考虑是否有任何 pythonic/faster 方法来执行此操作。 我正在使用 python3.7
编辑:
tag = None
for i, o in enumerate(l):
if tag is None:
x_a = o.x
elif x_a == o.x #duplicate found
temp = o.y
c_over = 0
c_value = o[i-1].z * o[i-1].a/1000
if c_value < o[i-1].y:
o[i-1].y = c_value
c_over = temp - c_value #carry over value
o[i] = c_over # either zero of carry over value
x_a = o.x
由于您正在修改对象的属性,因此您可以通过 zip
:
for a, b in zip(l, l[1:]):
if a.x == b.x:
a.y = a.z * a.a/1000
b.y = b.y - a.y
import itertools
import operator
l = [object0, object1, object2, object3, object4]
for k, g in itertools.groupby(l, key=operator.attrgetter('x')):
l = list(g)
for o1, o2, in zip(l, l[1:]): # Note 1, 2
o1.y = o1.z * o1.a / 1000
o2.y = o2.z - o1.y
备注:
- 假设您从头到尾修改组。如果你想反过来做,你必须用
zip(l[len(l)-2::-1], l[::-1])
替换 - 感谢@ShadowRanger 指出不需要
if
检查(由zip
处理)
zip(l, l[1:])