Алгоритм в Python для решения этой проблемы - PullRequest
1 голос
/ 10 мая 2011

У меня есть список списков, таких как: [[foo,1],[baz,1],[foo,0],[bar,3],[foo,1],[bar,2],[baz,2]].Я хочу получить все различные элементы во внутренних списках и найти их общее количество.Я имею в виду результат должен быть как: [[foo,2],[bar,5],[baz,3]].Как я могу выполнить эту задачу?

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

Ответы [ 4 ]

6 голосов
/ 10 мая 2011

Создать словарь

D = {}
for item in list:
  left,right=item
  D[left] = D.get(left, 0) + right

Хотя могут быть более быстрые способы сделать это.

Как предлагается в комментариях Джосе, Гнибблера и Блэра, вы можете сделать это, чтобы получить списокснова.

# To get a list of lists
pairs = map(list, D.items()) 
# To get a list of tuples
pairs = D.items()
4 голосов
/ 10 мая 2011

defaultdict делает это довольно легко:

import collections
items = [['foo',1],['baz',1],['foo',0],['bar',3],['foo',1],['bar',2],['baz',2]]

totals = collections.defaultdict(int)
for key, value in items:
    totals[key] += value

print totals

При запуске это дает

defaultdict(<type 'int'>, {'bar': 5, 'foo': 2, 'baz': 3})

Если вы хотите вывод списка, просто потяните элементыиз словаря

print totals.items()

, и вы получите

[('bar', 5), ('foo', 2), ('baz', 3)]

Если вы действительно хотите список списков в конце,

print [list(item) for item in totals.items()]

, который дает вам

[['bar', 5], ['foo', 2], ['baz', 3]]
0 голосов
/ 11 мая 2011

Если вы используете Python 3.2 (и 2.7), вы можете сделать:

>>> from collections import Counter
>>> items = [['foo',1],['baz',1],['foo',0],['bar',3],['foo',1],['bar',2],['baz',2]]
>>> Counter(sum(( [key]*count for key,count in items), []))
Counter({'bar': 5, 'baz': 3, 'foo': 2})
>>> Counter(sum(( [key]*count for key,count in items), [])).most_common()
[('bar', 5), ('baz', 3), ('foo', 2)]
>>> 
0 голосов
/ 10 мая 2011

Вы можете использовать itertools.groupby.

>>> import operator
>>> import itertools
>>> data = [['foo',1],['baz',1],['foo',0],['bar',3],['foo',1],['bar',2],['baz',2
]]
>>> {i:sum(k[1] for k in j)
...  for i, j in itertools.groupby(sorted(data, key=operator.itemgetter(0)),
...                                key=operator.itemgetter(0))}
{'baz': 3, 'foo': 2, 'bar': 5}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...