Как добавить определенные элементы списка списков в Python? - PullRequest
0 голосов
/ 07 мая 2018

Итак, я хочу добавить 3-е значение элементов в список списков, если первое и второе значения равны. А если нет, я хочу, чтобы неравные были добавлены в мой список сумм.

first=[[1,1,5],[2,3,7],[3,5,2],[4,4,6]]
second=[[1,1,3],[4,2,4],[2,3,2]]
sum=[]

for i in ((first)):
    for j in ((second)):
        if i[0]==j[0] and i[1]==j[1]:
            sum.append([i[0],j[1],i[2]+j[2]])


print(sum)

, так что это дает мне [[1, 1, 8], [2, 3, 9]], но я тоже хочу [3,5,2],[4,4,6],[4,2,4] в моем списке sum. Как мне сделать это в Pyhton?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Я пытался сделать это без словарей или библиотек:

first = [[1,1,5],[2,3,7],[3,5,2],[4,4,6]]
second = [[1,1,3],[4,2,4],[2,3,2]]
checked = []
sum = []

for n_i, i in enumerate(first):
    for n_j, j in enumerate(second):
        if i[0]==j[0] and i[1]==j[1]:
            sum.append([i[0],j[1],i[2]+j[2]])
            checked.append([n_i,n_j]) # Save the used index

# Delete used index
[first.pop(i[0]) and second.pop(i[1]) for i in reversed(checked)]

# Append non-used index
[sum.append(first.pop(0)) for x in range(0,len(first))]
[sum.append(second.pop(0)) for x in range(0,len(second))]

print(sum)

Возвращает:

[[1, 1, 8], [2, 3, 9], [3, 5, 2], [4, 4, 6], [4, 2, 4]]
0 голосов
/ 07 мая 2018

Одним из решений является использование collections.defaultdict из стандартной библиотеки.

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

first = [[1,1,5],[2,3,7],[3,5,2],[4,4,6]]
second = [[1,1,3],[4,2,4],[2,3,2]]

from collections import defaultdict
from itertools import chain

d = defaultdict(int)

for i, j, k in chain(first, second):
    d[(i, j)] += k

res = [[*k, v] for k, v in d.items()]

print(res)

[[1, 1, 8], [2, 3, 9], [3, 5, 2], [4, 4, 6], [4, 2, 4]]

Вот эквивалентное решение без использования каких-либо библиотек, использующее dict.setdefault:

d = {}
for i, j, k in first+second:
    d.setdefault((i, j), 0)
    d[(i, j)] += k

res = [[*k, v] for k, v in d.items()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...