Python中的算法来解决这个问题

Python中的算法来解决这个问题,python,algorithm,Python,Algorithm,我有一个列表,例如:[[foo,1],[baz,1],[foo,0],[bar,3],[foo,1],[bar,2],[baz,2]]。 我想得到内部列表中所有不同的项目,并找到它们的总数。 我的意思是结果应该是:[[foo,2],[bar,5],[baz,3]]。我怎样才能完成这项任务 提前感谢。创建一本词典 D = {} for item in list: left,right=item D[left] = D.get(left, 0) + right print totals.i

我有一个列表,例如:
[[foo,1],[baz,1],[foo,0],[bar,3],[foo,1],[bar,2],[baz,2]]
。 我想得到内部列表中所有不同的项目,并找到它们的总数。 我的意思是结果应该是:
[[foo,2],[bar,5],[baz,3]]
。我怎样才能完成这项任务

提前感谢。

创建一本词典

D = {}
for item in list:
  left,right=item
  D[left] = D.get(left, 0) + right
print totals.items()
不过,也许有更快的方法可以做到这一点

正如Joce、Gnibbler和Blair在评论中建议的那样,你可以这样做以再次获得一份名单

# To get a list of lists
pairs = map(list, D.items()) 
# To get a list of tuples
pairs = D.items()
创建字典

D = {}
for item in list:
  left,right=item
  D[left] = D.get(left, 0) + right
print totals.items()
不过,也许有更快的方法可以做到这一点

正如Joce、Gnibbler和Blair在评论中建议的那样,你可以这样做以再次获得一份名单

# To get a list of lists
pairs = map(list, D.items()) 
# To get a list of tuples
pairs = D.items()
这样做相当容易:

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})
你得到了什么

[('bar', 5), ('foo', 2), ('baz', 3)]
如果你真的想在末尾列出一个列表

print [list(item) for item in totals.items()]
这给了你

[['bar', 5], ['foo', 2], ['baz', 3]]
这样做相当容易:

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})
你得到了什么

[('bar', 5), ('foo', 2), ('baz', 3)]
如果你真的想在末尾列出一个列表

print [list(item) for item in totals.items()]
这给了你

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

您可以使用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}

您可以使用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}

如果您使用的是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)]
>>> 

如果您使用的是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)]
>>> 

您可以在D.iteritems()中为(k,v)添加
pairs=[(k,v)for(k,v)]
以在列表中检索。
pairs=D.items()
也会这样做。@Blair,我想Joce是打错了。他可能会把[(k,v)…]放在[(k,v)…]里,而不是放在[(k,v)…]里,他会在声明中把项目拆到(左,右),以便比这个表达更好?布莱尔是对的<代码>D.items()更好。在这一点上,我删除了我平庸的回答!:-p你可以在D.iteritems()中为(k,v)添加
pairs=[(k,v)]
以在列表中检索。
pairs=D.items()
也会做同样的事情。@Blair,我想Joce是打错了。他可能会把[(k,v)…]放在[(k,v)…]里,而不是放在[(k,v)…]里,他会在声明中把项目拆到(左,右),以便比这个表达更好?布莱尔是对的<代码>D.items()更好。在这一点上,我删除了我平庸的回答!:-P