Джедайский вариант (в одну строчку):
#!/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)
Для практического применения в таком виде не рекомендуется

По поводу itertools.groupby() - функция не будет правильно работать, если перед группировкой список не отсортировать по группируемому полю.
Вообще если хотите получить более эффективный код - не используйте groupby, а лучше напишите свою функцию.
Алгоритм примерно такой:
- 1. Запускаете цикл по строкам списка;
2. С первой же строки создаете словарь, в котором будут храниться пары ключ->значение. При этом ключом будет являться содержимое столбца (в Вашем случае “имя_1”), а значением - сами строки (точнее ссылки на них, в питоне по-умолчанию переменные не копируются, а передаются по ссылкам);
- 3. В процессе итераций цикла, сверяете ключевое поле со своим словарем. Если есть совпадение, сохраняете строку (ссылку на неё) в словарь по ключу;
- 4. После того, как прошлись таким образом по всему списку, запускаете еще один цикл по Вашему словарю, который уже будет содержать практически те же самые данные, что и groupby;
- 5. В процессе прохождения каждой группы (в словаре) суммируете нужный Вам столбец (по всей группе) и возвращаете результат в виде строки, но заменяете колонку с количеством на своё значение суммы.
Вот, примерно как-то так получается. Такой алгоритм позволит избежать ненужной сортировки.
Если хотите что-то более эффективное, можете заглянуть в исходники PostgreSQL, или почитать как вообще реализован этот функционал в различных СУБД.