如何添加列表的特定部分?

时间:2016-06-29 19:19:52

标签: python 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循环,如果日期相似,它将总结数据。但是我很难理解如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

使用字典保留唯一日期:

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

话虽这么说,每当你使用日期时,将它们存储为日期时间对象通常很有用,然后添加日期等操作会更直接。

答案 1 :(得分:1)

查找列表中的所有日期,然后您可以计算每个日期:

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)]

答案 2 :(得分:1)

以下是基于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解释。