Группа и сумма Python со строкой в ​​качестве ключей

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

Input = [["A",0.2],["B",0.5],["A",0.6],["C",0.1],["B",0.9]]

Желаемый результат:

Output = [["A",0.8],["B",1.4],["C",0.1]]

Спасибо!

Я предлагаю вам начать с листа бумаги и карандаша и записать шаги, необходимые для этого. Как только у вас в голове появится четкая идея, используя английский или любой другой письменный язык, который вы знаете лучше всего, вам будет легче перевести его на python.

Code-Apprentice 06.03.2019 00:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
80
5

Ответы 5

Вы можете использовать это:

Dict = {group[0]: 0 for group in Input}
for group in Input: Dict[group[0]] += group[1]
Output = [[group, value] for group, value in Dict.items()]

У dict могут быть только уникальные ключи, поэтому мы решаем половину проблем. Для начала каждое значение каждого ключа будет равно 0.

Затем мы повторяем Input и добавляем каждое значение к соответствующему ключу в нашем Dict. Итак, наша работа почти завершена.

Нам нужно только преобразовать его в желаемую форму, используя список понимания.

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

lst = [["A",0.2],["B",0.5],["A",0.6],["C",0.1],["B",0.9]]

d = dict()
for sl in lst:
    d[sl[0]] = d.get(sl[0], 0) + sl[1]

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

d.get(sl[0], 0) великолепен, он сильно упрощает цикл for! +1

Allan 06.03.2019 01:02

Спасибо, работает идеально!

Benj 25.04.2019 17:49

Я бы порекомендовал пойти на dict, как показано ниже:

inp = [["A",0.2],["B",0.5],["A",0.6],["C",0.1],["B",0.9]]

#create an empty dict
out = {}
#for each element of the inp list
for a in inp:
  #if the key does already exist in the dict, you sum the current value
  #with what was found in the array at this iteration 
  if a[0] in out:
    out.update({a[0]:a[1]+out.get(a[0])})
  #you create a new pair (new key, new value) extract from inp
  else:
    out.update({a[0]:a[1]})

print out
#if you really need a nested list as output you can convert back the dict
#into a list of list
res = [[key, val] for key, val in out.items()]
print res

выход:

{'A': 0.8, 'C': 0.1, 'B': 1.4}
[['A', 0.8], ['C', 0.1], ['B', 1.4]]

Вы можете сделать это:

from collections import defaultdict

sums = defaultdict(lambda: 0)
for arr in input:
    sums[arr[0]] += arr[1]

output = [[key, value] for key,value in sums.items()] 

Этот способ кажется мне наиболее идиоматичным. Следуя соглашению Python, вы должны называть свои переменные строчными буквами и символом подчеркивания. Вы можете узнать больше о defaultdict здесь: https://docs.python.org/3.6/library/collections.html

Это должно работать:

Output = [ [k,sum(a[1] for a in Input if a[0] == k)] for k in set(a[0] for a in Input) ]

Другие вопросы по теме