python在列表中查找重复的对象
我有一张单子python在列表中查找重复的对象,python,python-3.x,python-3.7,Python,Python 3.x,Python 3.7,我有一张单子 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 * object
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
可以保证在连续对象中存在重复项
例如,可能有两个以上的副本
object12.x == object13.x == object14.x
因此,根据修改后的第二个副本的值,修改将以与第三个副本相同的方式进行
我已经写了一个循环来实现它,但是我在想是否有任何pythonic/更快的方法来实现它。
我正在使用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
tag=None
对于枚举(l)中的i,o:
如果标记为“无”:
x_a=o.x
elif x_a==o.x#发现重复项
温度=o.y
c_超过=0
c_值=o[i-1].z*o[i-1].a/1000
如果c_值
由于您正在修改对象的属性,因此可以通过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,l[1:])替换zip(l[len(l)-2::-1],l[:-1])
if
检查(由邮政编码处理)
您是否可以显示您现有的循环,以便其他人能够建议如何改进它,或者以其他方式建议其他方法?您需要
itertools.groupby
,使用操作符.attrgetter('x')
作为键
函数。您可以使用zip(l,l[1:])中的for(prev,current)对列表中的几对进行迭代:
现在正在列表中枚举,如果发现重复项,则修改上一个元素。发布循环代码比这更棘手的是,可能存在一个c
,其中b.x==c.x
,但由于您在检查c
之前正在修改b
,因此您缺少它。@Ev.Kounisb.x
从未被修改过,因此此处没有遗漏任何内容x
用于检查,并且y
被修改。您是对的。这个问题有点模棱两可,仔细想想吧。我不清楚修改是从小组开始还是结束。假设三元组为(a,b,c),c
的修改将与您和我的答案中已修改的b
值一起进行。@Ev.Kounis这是OP明确要求的:“[…]因此修改将以与第三个副本相同的方式进行,基于修改后的第二个副本的值。”注意:您不需要检查长度(如果l[1://code>为空,zip
将立即终止),并且如果您正在向前运行,您可以使用itertools.tee
,以避免列表
出现任何虚化(这使得它完全是惰性的;在需要元素之前没有实现它们)g,g2=itertools.tee(g)
,next(g2)
,对于邮政编码中的o1和o2(g,g2):