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])
  • Suddos@ShadowRanger指出不需要进行
    if
    检查(由
    邮政编码处理)

  • 您是否可以显示您现有的循环,以便其他人能够建议如何改进它,或者以其他方式建议其他方法?您需要
    itertools.groupby
    ,使用
    操作符.attrgetter('x')
    作为
    函数。您可以使用zip(l,l[1:])中的
    for(prev,current)对列表中的几对进行迭代:
    现在正在列表中枚举,如果发现重复项,则修改上一个元素。发布循环代码比这更棘手的是,可能存在一个
    c
    ,其中
    b.x==c.x
    ,但由于您在检查
    c
    之前正在修改
    b
    ,因此您缺少它。@Ev.Kounis
    b.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):