Sea*_*ean 2 python tuples list set
我有一个"标记"元组列表...每个元组都是(tag_id,value)...就像这样:
my_list = [(tag_A, 100), (tag_A, 200), (tag_A, 300), (tag_A, 400), (tag_B, 400), (tag_B, 600)]
Run Code Online (Sandbox Code Playgroud)
我想用相同的标签将每个元组的值相加...这样:
sum_of_all_values_with_tag_A() = 1000
sum_of_all_values_with_tag_B() = 1000
Run Code Online (Sandbox Code Playgroud)
我无法想出一个简单的Pythonic方法.
sum(set(value for tag_id, value in my_list))
Run Code Online (Sandbox Code Playgroud)
...返回所有值的总和.
我想我可以使用for或while循环来包装它,这样只有那个带有我想要求和的标签的元组被这个表达式触及......?我需要将与两个标签相关联的值相加...得到两个不同的总数,如上所述区分.但是对于这样的事情,不能完全理解一种优雅的语法.
这发生在预先存在的功能内部.没有嵌套功能就可以做到这一点.
任何建议表示赞赏!
使用生成器表达式对每个标记求和:
sum(val for tag, val in my_list if tag == tag_A)
Run Code Online (Sandbox Code Playgroud)
您可以对标记进行排序,然后使用它itertools.groupby来创建每个标记组和总和:
from itertools import groupby
from operator import itemgetter
key = itemgetter(0) # tag
sums = {tag: sum(tup[1] for tup in group)
for tag, group in groupby(sorted(my_list, key=key), key=key)}
Run Code Online (Sandbox Code Playgroud)
这将产生一个字典映射标签到每个标签总和:
>>> from itertools import groupby
>>> from operator import itemgetter
>>> tag_A, tag_B = 'A', 'B'
>>> my_list = [(tag_A, 100), (tag_A, 200), (tag_A, 300), (tag_A, 400), (tag_B, 400), (tag_B, 600)]
>>> key = itemgetter(0) # tag
>>> sums = {tag: sum(tup[1] for tup in group)
... for tag, group in groupby(sorted(my_list, key=key), key=key)}
>>> print sums
{'A': 1000, 'B': 1000}
Run Code Online (Sandbox Code Playgroud)
将您的数据放入defaultdict(list).总结一下.
from collections import defaultdict
my_list = [('tag_A', 100), ('tag_A', 200), ('tag_A', 300), ('tag_A', 400), ('tag_B', 400), ('tag_B', 600)]
d = defaultdict(list)
for tag, num in my_list:
d[tag].append(num)
Run Code Online (Sandbox Code Playgroud)
>>> from collections import defaultdict
>>> my_list = [('tag_A', 100), ('tag_A', 200), ('tag_A', 300), ('tag_A', 400), ('tag_B', 400), ('tag_B', 600)]
>>>
>>> d = defaultdict(list)
>>> for tag, num in my_list:
... d[tag].append(num)
...
>>> from pprint import pprint
>>> pprint(dict(d))
{'tag_A': [100, 200, 300, 400], 'tag_B': [400, 600]}
>>>
>>> pprint({k: sum(v) for k, v in d.iteritems()})
{'tag_A': 1000, 'tag_B': 1000}
Run Code Online (Sandbox Code Playgroud)
def summarize_by_tag(d):
for k, v in d.iteritems():
print k, sum(v)
>>> summarize_by_tag(d)
tag_A 1000
tag_B 1000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2461 次 |
| 最近记录: |