簡體   English   中英

如何將列表的特定部分加起來?

[英]How to add up specific parts of a list?

我有一個包含一堆數據的列表,格式為: date, month, data

我希望所有具有相同日期的條目將其所有數據匯總起來,而輸出將只是日期,數據。 換句話說,數據看起來像這樣

[(1/1/2011, August, 5), (1/1/2011, July, 4), (1,1,2011, June, 1), (1/6/2011, December, 5)]

對於此示例,我希望輸出如下所示:

[(1/1/2011, 10), (1/6/2011, 5)]

我將如何去做呢? 我知道這會涉及到for循環,如果日期相似,它將對數據進行匯總。 但是我對如何解決這個問題感到困惑。

使用字典來保留唯一的日期:

dates = {}
for (date, month, day) in your_list:
    if date not in dates:
        dates[date] = day
    else
        dates[date] += day

然后,如果您想要指定的輸出,則必須返回到列表:

outlist = []
for (date, daycount) in dates.items():
    outlist.append( (date, daycount) )

話雖如此,無論何時使用日期,通常將它們存儲為datetime對象都是很有用的,然后像添加日期這樣的操作就更簡單了。

在列表中找到所有日期,然后可以計算每個日期:

dates = [('1/1/2011', 'August', 5), ('1/1/2011', 'July', 4),
         ('1/1/2011', 'June', 1), ('1/6/2011', 'December', 5)]

each_date = set(d[0] for d in dates)

count_dates = [(d, sum(i[2] for i in dates if i[0] == d)) for d in each_date]

print(count_dates)
# -> [('1/6/2011', 5), ('1/1/2011', 10)]

這是基於itertools.groupby()的單行代碼:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> dates = [('1/1/2011', 'August', 5), ('1/1/2011', 'July', 4), 
             ('1/1/2011', 'June', 1), ('1/6/2011', 'December', 5)]
>>> [(date, sum(map(itemgetter(-1), group))) for (date, group) in groupby(dates, key=itemgetter(0))]
[('1/1/2011', 10), ('1/6/2011', 5)]

請注意,在此演示中,我使用了與@alecrasmussen答案相同的dates因為OP無法提供Python解釋的數據。

暫無
暫無

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

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