Python 如何添加列表中的特定部分?
我有一个包含大量数据的列表,格式为:Python 如何添加列表中的特定部分?,python,list,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循环,如果一个日期
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)]
这是一个基于以下内容的单行程序:
请注意,对于这个演示,我使用了与@alecrasmussen的答案相同的
日期
,因为OP提供的数据不能被Python解释。您的输入是不同的。@RahulKP给定的输入不一样parse@JaredGoguen用问题和答案检查输入。@RahulKP无论日期如何,它都应该仍然有效格式化(除非是带有日期和时间数据的datetime对象)。正如filifunk所说,列表将返回一个NameError,尝试分配一个名为1/1/2011的变量将产生一个SyntaxError,因为/是一个运算符。在第一个循环中,您还可以使用dates=collections.defaultdict(int)
,然后只使用dates[date]+=day
,而不是if-else
我怎么会不知道呢?对于第二段代码,可能是outlist=list(dates.items())
对于Python3.X或outlist=dates.items()
对于Python2.X,您还可以通过dict.get()摆脱if-else
语句
方法,将默认值设置为0
dates[date]=day+dates.get(date,0)
这些都是很好的建议,但我将保持原样,以便OP可以尝试if/else方法,然后使用这些更高级的概念使其更简洁。然后他/她可以发表评论并实施这些好的技巧
>>> 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)]