python найти дубликаты объектов в списке - PullRequest
2 голосов
/ 13 марта 2020

У меня есть список

l = [object0, object1, object2, object3, object4....object499]

максимальная длина не более 500

Все объекты имеют атрибуты x, y, z,

Я должен изменить object.y, если дубликаты в object.x как:

if object9.x == object10.x:
  object9.y = object9.z * object9.a/1000
  object10.y = object10.y - object9.z * object9.a/1000

Гарантируется, что дубликаты будут в последовательных объектах.

Может быть более 2 дубликатов ie например

object12.x == object13.x == object14.x

поэтому модификация будет продолжаться таким же образом с третьим дубликатом, основываясь на значении модифицированного второго дубликата.

Я написал al oop, чтобы сделать это, но подумал, что если есть какой-нибудь питон / более быстрый способ сделать это. Я использую 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 

Ответы [ 2 ]

3 голосов
/ 13 марта 2020

Поскольку вы изменяете атрибуты своих объектов, вы можете l oop по последовательным парам через 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
2 голосов
/ 13 марта 2020

@ Комментарий Shadow Ranger - определенно путь к go здесь. Я этого не проверял, но он должен выполнить трюк

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

Примечания:

  1. при условии, что вы изменяете группы от начала до конца. Если вы хотите сделать это наоборот, вы должны заменить zip(l, l[1:]) на zip(l[len(l)-2::-1], l[::-1])
  2. kudos @ShadowRanger, чтобы указать, что проверка if не нужна (обрабатывается zip )
...