Форум сайта python.su
0
Привет всем. Подскажите алгоритм, пожалуйста.
Есть список вида:
список = [[имя 1, кол-во], [имя_1, кол-во], [имя_1, кол-во], [имя_2, кол-во], [имя_3, кол-во], [имя_3, кол-во], [имя_3, кол-во], [имя_4, кол-во], [имя_4, кол-во], [имя_4, кол-во]]
новый_список = [ [имя_1, суммарное_кол-во], [имя_2, суммарное_кол-во], [имя_3, суммарное_кол-во], [имя_4, суммарное_кол-во]]
Отредактировано orlov (Июнь 27, 2014 12:19:35)
Офлайн
221
orlov
Смотрите модуль itertools а именно groupby
Офлайн
0
JOHN_16,
когда пытался решить эту проблему, как раз подумал, что здесь не хватает GROUP BY из SQL. Значит есть такая штука) Спасибо, буду пробовать.
Офлайн
7
Джедайский вариант (в одну строчку):
#!/usr/bin/python # encoding: utf-8 import itertools data = [ ["name 1", 1], ["name 1", 4], ["name 1", 2], ["name 2", 10], ["name 3", 1], ["name 3", 3], ["name 3", 1], ["name 4", 7], ["name 4", 1], ["name 4", 2], ] def group_and_sum(group_by, sum_by): return map( lambda x: reduce( lambda accum, cur: [item if i != sum_by else item + cur[sum_by] for i,item in enumerate(accum)], x[1] ), itertools.groupby( sorted(data, key=lambda x: x[group_by]), key=lambda x: x[group_by] ) ) print group_and_sum(0, 1)

Отредактировано john123 (Июнь 27, 2014 15:31:48)
Офлайн
88
data = [ ["name 1", 1], ["name 1", 4], ["name 1", 2], ["name 2", 10], ["name 3", 1], ["name 3", 3], ["name 3", 1], ["name 4", 7], ["name 4", 1], ["name 4", 2], ] r = {} for n, v in data: r[n] = r.get(n, 0) + v print r
Офлайн
7
Shamandata = [ ["name 1", 1], ["name 1", 4], ["name 1", 2], ["name 2", 10], ["name 3", 1], ["name 3", 3], ["name 3", 1], ["name 4", 7], ["name 4", 1], ["name 4", 2], ] r = {} for n, v in data: r[n] = r.get(n, 0) + v print r
Отредактировано john123 (Июнь 27, 2014 16:03:36)
Офлайн
88
john123Беда..
У Вас словарь возвращается, а не список
print r.items()
john123Это будет совсем другая история.
А во-вторых, что если в строке будет больше двух колонок?
Офлайн
58
ShamanСогласен. Есть четкое задание. Нужно ему и следовать.
Это будет совсем другая история.
Офлайн
7
4kpt_IIЕсли следовать ему четко, то нужно список возвращать, а не словарь
Согласен. Есть четкое задание. Нужно ему и следовать.
Отредактировано john123 (Июнь 27, 2014 16:31:15)
Офлайн
33
трам пам пам, туп пиду
map(lambda x: [x[0], reduce(lambda x1, x2: ['', x1[1]+x2[1]], x[1])[1]], groupby(sorted(lst, key=itemgetter(0)), key=itemgetter(0)))
Офлайн