索引0值匹配的总和列表值?
问题描述:
我有一个列表的列表,我想合并它们来求和index[0]
值匹配的内部index[1]
值。我的名单看起来是这样的:索引0值匹配的总和列表值?
lists = [
['Gifts', [4]],
['Gifts', [4]],
['Politics', [3]],
['Supply', [4]],
['Supply', [4]],
['Prints', [1]],
['Prints', [1]],
['Prints', [1]],
['Politics', [3]],
['Politics', [3]],
['Accounts', [2]],
['Accounts', [2]],
['Accounts', [2]],
['Features', [3]],
['Features', [2]]
]
因此,我要像新的结构是:
new_lists = [
['Gifts', 8], ['Politics', 9], ['Supply', 8], ['Prints', 3], ['Accounts', 6], ['Features', 5]
]
如何在Python实现这一目标?
答
您可以使用defaultdict(int)
从collections
模块:
>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for key, value in lists:
... d[key] += value[0]
...
>>> dict(d)
{'Gifts': 8, 'Prints': 3, 'Accounts': 6, 'Features': 5, 'Supply': 8, 'Politics': 9}
>>> list(d.items())
[('Prints', 3), ('Features', 5), ('Supply', 8), ('Gifts', 8), ('Accounts', 6), ('Politics', 9)]
答
使用defaultdict
:
In [52]: from collections import defaultdict
In [53]: d = defaultdict(int)
In [54]: for name, (val,) in lists:
....: d[name] += val
....:
In [55]: d.items()
Out[55]: dict_items([('Politics', 9), ('Supply', 8), ('Prints', 3), ('Features', 5), ('Gifts', 8), ('Accounts', 6)])
答
或者,使用Counter
从collections
。您可以手动为每个键递增值初始化:
from collections import Counter
c = Counter()
for i, j in lists:
c[i] += l[j]
或者,通过提供的扩展内容的简单列表,Counter
会那么做的计数为您提供:
c = Counter(sum([[i] * j[0] for i,j in lists], []))
在这两种情况下,通过使用列表中理解抓住计数器的内容与c.items()
创建结果列表:
r = [[i, j] for i, j in c.items()]
结果为:
print(r)
[['Supply', 8], ['Features', 5], ['Prints', 3],
['Gifts', 8], ['Accounts', 6], ['Politics', 9]]
你确定你的嵌套是正确的吗?它是'['Gifts',[4]]还是'['Gifts',4],' – Bharel