Объедините два списка: совокупные значения, имеющие одинаковые ключи - PullRequest
0 голосов
/ 05 октября 2009

У меня есть два списка или больше, чем. Примерно так:

listX = [('A', 1, 10), ('B', 2, 20), ('C', 3, 30), ('D', 4, 30)]
listY = [('a', 5, 50), ('b', 4, 40), ('c', 3, 30), ('d', 1, 20), 
         ('A', 6, 60), ('D', 7, 70])

Я хочу получить результат, который перемещает повторяющиеся элементы, например: мой результат состоит в том, чтобы получить весь список из listX + listY, но в случае дублирования например элемент ('A', 1, 10), ('D', 4, 30) из listX представлен или завершен в listY.так, результат будет таким:

result = [('A', 7, 70), ('B', 2, 20), ('C', 3, 30), ('D', 11, 100),
          ('a', 5, 50), ('b', 4, 40), ('c', 3, 30), ('d', 1, 20)]

(A, 7, 70) получается сложением ('A', 1, 10) и ('A', '6', '60') вместе

Кто-нибудь может мне решить эту проблему.? Спасибо.

Ответы [ 4 ]

8 голосов
/ 05 октября 2009

Это довольно легко, если вы используете словарь.

combined = {}
for item in listX + listY:
    key = item[0] 
    if key in combined:
        combined[key][0] += item[1]
        combined[key][1] += item[2]
    else:
        combined[key] = [item[1], item[2]]

result = [(key, value[0], value[1]) for key, value in combined.items()]
2 голосов
/ 05 октября 2009

Вы, кажется, используете списки как словарь. По какой причине вы используете списки вместо словарей?

Мое понимание этого искаженного вопроса заключается в том, что вы хотите сложить значения в кортежах, где первый элемент совпадает.

Я бы сделал что-то вроде этого:

counter = dict(
    (a[0], (a[1], a[2]))
    for a in listX
)

for key, v1, v2 in listY:
    if key not in counter:
        counter[key] = (0, 0)
    counter[key][0] += v1
    counter[key][1] += v2

result = [(key, value[0], value[1]) for key, value in counter.items()]
1 голос
/ 05 октября 2009

Я бы сказал, использовать словарь:

result = {}
for eachlist in (ListX, ListY,):
    for item in eachlist:
        if item[0] not in result:
            result[item[0]] = item

Всегда сложно манипулировать данными, если у вас есть данные в структуре, которая не очень хорошо представляет данные. Рассмотрите возможность использования более качественных структур данных.

0 голосов
/ 05 октября 2009

Использовать словарь и его метод get.

d = {}
for x in (listX + listY):
    y       = d.get(x[0], (0, 0, 0))
    d[x[0]] = (x[0], x[1] + y[1], x[2] + y[2])

d.values()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...