Объединение частей списка внутри списка - PullRequest
1 голос
/ 27 марта 2020

Имеется такой список:

[['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]

Мне нужно добавить компоненты двух списков с одинаковым первым индексом, например, так:

[['james',300,500,700],['charles',200,200,100]]

Спасибо за ответы. Просто выяснил, что я должен сделать это без импорта каких-либо модулей Есть ли способ сделать это? Я пытался использовать циклы for, но не могу найти, для чего индексировать.

Ответы [ 4 ]

0 голосов
/ 27 марта 2020
dic = {}
for row in a:
    if row[0] in dic:
        dic[row[0]] = [sum(n) for n in zip(*[dic[row[0]], row[1:]])]
    else:
        dic[row[0]] = row[1:]

ans = []
for key in dic:
    ans.append([key, *dic[key]])

Вы можете создать словарь с names as keys и subsequent numbers as the value. Наконец, вы можете преобразовать словарь в список списков.

[sum(n) for n in zip(*[dic[row[0]], row[1:]])] используется для суммирования элементов 2 соответствующих списков, см. Здесь: { ссылка }

0 голосов
/ 27 марта 2020

Хм ... нет импорта звучит как домашнее задание. Python это все о повторном использовании. Однако, просто для удовольствия:

data = [['james', 100, 200, 300], ['james', 200, 300, 400], ['charles', 200, 200, 100]]


def combine_lists(data, result=None):
    if result is None:
        result = []
    if data:
        return combine_lists(data[1:], _add_sublist(data[0], result))
    return result


def _add_sublist(sublist, result):
    result_out = []
    combined = False
    for result_sublist in result:
        if sublist[0] == result_sublist[0]:
            result_out.append([sublist[0], *[from_elt + into_elt
                                             for from_elt, into_elt in zip(sublist[1:], result_sublist[1:])]])
            combined = True
        else:
            result_out.append(result_sublist)
    if not combined:
        result_out.append(sublist)
    return result_out

Запуск функции в оболочке с использованием ваших данных:

In [4]: combine_lists(data)                                                                                                                        
Out[4]: [['james', 300, 500, 700], ['charles', 200, 200, 100]]

Убедитесь, что вы понимаете код перед его передачей:)

0 голосов
/ 27 марта 2020
data=[['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]
dic={}
for sample in data:
    if sample[0] in dic.keys():
        dic[sample[0]] = [x+y for x,y in zip(dic[sample[0]],sample[1:])]
    else:
        dic[sample[0]] = sample[1:]
data= [[x]+y for x,y in dic.items()]

Объяснение: for l oop выполняет итерации по всем элементам списка. Используя 1-й элемент каждого списка, мы проверяем, есть ли у «di c» это имя в качестве ключа или нет. Если да, мы добавляем к предыдущим значениям ключа, иначе создаем ключ со значениями «sample [1:]». Последний шаг преобразует словарь «di c» в нужный список

0 голосов
/ 27 марта 2020

вы можете использовать collections.defaultdict:

from  collections import defaultdict

l = [['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]


d = defaultdict(list)
for k, *v in l:
    d[k].append(v)

[[k, *[sum(e) for e in zip(*v)]] for k, v in d.items()]

вывод:

[['james', 300, 500, 700], ['charles', 200, 200, 100]]

без импорта какого-либо модуля:

l = [['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]


d = {}
for k, *v in l:
    d.setdefault(k, []).append(v)

[[k, *[sum(e) for e in zip(*v)]] for k, v in d.items()]

вывод:

l = [['james',100,200,300],['james',200,300,400], ['charles',200,200,100]]
...