Лучший способ объединить два списка и объединить двойные значения? - PullRequest
0 голосов
/ 24 января 2020

Каков наилучший способ объединить два списка в один, а также объединить двойные значения? Например:

list_01 = [['2020-01-02', '2020-01-03', '2020-01-04', '2020-01-06'], 
           ['10', '20', '30', '40']]

list_02 = [['2020-01-04', '2020-01-05', '2020-01-06', '2020-01-07'],
           ['10', '20', '30', '40']]

Окончательный список должен выглядеть следующим образом:

list_03 = [['2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05', '2020-01-06', '2020-01-07'],
           ['10', '20', '40', '30', '70', '40']]

При совпадении дат целочисленные значения во втором столбце суммируются вместе.

Прямо сейчас, мое единственное реальное решение - пропустить оба списка через несколько циклов, но мне интересно, может ли быть лучшее решение.

Спасибо и отличного вечера для всех вас.

Ответы [ 3 ]

3 голосов
/ 25 января 2020

Ваши "целые числа" должны быть целыми числами, а не строками, и ваши списки, вероятно, должны составлять Counter с, как вы, кажется, считаете вещей в день. Затем вы можете просто добавить их:

from collections import Counter

list_01 = [['2020-01-02', '2020-01-03', '2020-01-04', '2020-01-06'], 
           ['10', '20', '30', '40']]

list_02 = [['2020-01-04', '2020-01-05', '2020-01-06', '2020-01-07'],
           ['10', '20', '30', '40']]

def to_counter(lst):
    return Counter(dict(zip(lst[0], map(int, lst[1]))))

counter = to_counter(list_01) + to_counter(list_02)

for item in counter.items():
    print(item)

Отпечатки:

('2020-01-02', 10)
('2020-01-03', 20)
('2020-01-04', 40)
('2020-01-06', 70)
('2020-01-05', 20)
('2020-01-07', 40)
2 голосов
/ 25 января 2020

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

from collections import defaultdict
mydict = defaultdict(int) # default values are 0

list_01 = [['2020-01-02', '2020-01-03', '2020-01-04', '2020-01-06'], ['10', '20', '30', '40']]
list_02 = [['2020-01-04', '2020-01-05', '2020-01-06', '2020-01-07'], ['10', '20', '30', '40']]

for t in [list_01, list_02]:
    for key, value in zip(t[0], t[1]):
        mydict[key] += int(value)

print(list(zip(*sorted(mydict.items()))))

Это напечатает:

[('2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05', '2020-01-06','2020-01-07'),
     (10, 20, 40, 20, 70, 40)]
2 голосов
/ 25 января 2020

Попробуйте, составьте словари. Дайте мне знать, если это не то, что вам нужно или это сбивает с толку.

dict_01 = {list_01[0][i]:int(list_01[1][i]) for i in range(len(list_01[0]))}
dict_02 = {list_02[0][i]:int(list_02[1][i]) for i in range(len(list_02[0]))}
dates = list(set(list_01[0] + list_02[0]))
dates.sort()
list_03 = [dates, [dict_01.get(date, 0) + dict_02.get(date, 0) for date in dates]]

@ Tomerikoo указывает на более элегантный способ формирования словарей.

dict_01 = dict(zip(*list_01))
dict_02 = dict(zip(*list_02))

Как @HeapOverflow указывает если вы сделаете это, вы должны изменить суммы.

list_03 = [dates, [int(dict_01.get(date, 0)) + int(dict_02.get(date, 0)) for date in dates]]

Это возвращает

[['2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05', '2020-01-06', '2020-01-07'], [10, 20, 40, 20, 70, 40]]

Я думаю, что это правильно, и 2020-01-05 должно быть 20, а не 30.

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