Объединение и добавление вложенных списков - PullRequest
0 голосов
/ 26 октября 2019

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

Пример ввода:

input_list = [['123', '6', '2'], ['123','4','55'], ['123','6','3']

Ожидаемый результат:

output_list = [['123','6','5'], ['123','4','55']]

123 и 6 были одинаковыми, поэтомуон был объединен, а затем 2 + 3 = 5

123,4,55 не имеет дубликатов, поэтому он остается прежним

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 26 октября 2019

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

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

input_list = [['123', '6', '2'], ['123','4','55'], ['123','6','3']]

res = {}

for i in input_list:
    if (i[0], i[1]) not in res:
        res.update({(i[0], i[1]):int(i[2])})
    else:
        res[(i[0],i[1])]+=int(i[2])

output_list = [[k[0],k[1], str(v)] for k,v in res.items()]

print(output_list)

output

[['123', '6', '5'], ['123', '4', '55']]
0 голосов
/ 26 октября 2019

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

Для меня решение состоит в том, чтобы вынимать элемент за один раз, используяpop (), а затем просматривая оставшуюся часть ввода, повторяя и проверяя оставшиеся элементы с такими же элементами [0] и [1].

Если они есть, я бы также сделал pop (), которыйэлемент, сумма третьего элемента и завершение итерации. Когда он завершен, полученный элемент попадает в список вывода.

Затем повторяйте, пока на входе больше нет элементов.

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

0 голосов
/ 26 октября 2019

Вы можете использовать dict для агрегации значений одного и того же ключа, а также использовать понимание списка для построения желаемого списка вывода из dict:

output = {}
for *key, value in input_list:
    key = tuple(key)
    output[key] = output.get(key, 0) + int(value)
output_list = [[*key, str(value)] for key, value in output.items()]

output_list становится:

[['123', '6', '5'], ['123', '4', '55']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...