簡體   English   中英

Python list_of_tuples:每個元組的第二個val,僅當元組的第一個val ==

[英]Python list_of_tuples: sum second val of each tuple, only if first val of tuple == something

我有一個“標記”元組列表...每個元組都是(tag_id,value)...就像這樣:

my_list = [(tag_A, 100), (tag_A, 200), (tag_A, 300), (tag_A, 400), (tag_B, 400), (tag_B, 600)]

我想用相同的標簽將每個元組的值相加...這樣:

sum_of_all_values_with_tag_A() = 1000

sum_of_all_values_with_tag_B() = 1000

我無法想出一個簡單的Pythonic方法。

sum(set(value for tag_id, value in my_list)) 

...返回所有值的總和。

我想我可以用for或while循環來包裝它,這樣只有那個帶有我想要求和的標簽的元組被這個表達式觸及......? 我需要將與兩個標簽相關聯的值相加...得到兩個不同的總數,如上所述區分。 但是對於這樣的事情,不能完全理解一種優雅的語法。

這發生在預先存在的功能內部。 沒有嵌套功能就可以做到這一點。

任何建議表示贊賞!

使用生成器表達式對每個標記求和:

sum(val for tag, val in my_list if tag == tag_A)

您可以標記進行排序 ,然后使用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)}

這將產生一個字典映射標簽到每個標簽總和:

>>> 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}

途徑

將您的數據放入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)

測試

>>> 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}

備選摘要例程

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

和其他答案一樣,我只會使用defaultdict但除非你以后再次需要這些組。 只要在分組時加以總結即可。 my_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)]
result = defaultdict(int)
for tag, value in my_list:
    result[tag] += value
print result

defaultdict(<type 'int'>, {'tag_A': 1000, 'tag_B': 1000})

沒有進口任何東西

mysum={}
my_list = [('tag_A', 100), ('tag_A', 200), ('tag_A', 300), ('tag_A', 400), ('tag_B', 400), ('tag_B', 600)]
for x in my_list:
    mysum.setdefault(x[0],0)
    mysum[x[0]]+=x[1]
print mysum

輸出::

{'tag_A': 1000, 'tag_B': 1000}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM