我想迭代列表Dates
中的值,然后首先将Date_Values[0]
中的项目计数小于Date
中的值,然后在Date_Values[1]
中追加项目数{1}}小于Date
导入日期时间
Dates_Values = [['10-12-2014','11-1-2014'],['10-18-2014','10-26-2014']]
Dates = [['10-14-2014'],['10-19-2015']]
for key, item in enumerate(Dates):
Dates[key].append(sum(1 for item in Dates_Values if datetime.datetime.strptime(str(item[0]), '%m-%d-%Y') > (datetime.datetime.strptime(str(item[0]), '%m-%d-%Y'))))
Dates[key].append(sum(1 for item in Dates_Values if datetime.datetime.strptime(str(item[1]), '%m-%d-%Y') > (datetime.datetime.strptime(str(item[1]), '%m-%d-%Y'))))
print Dates
输出:
[['10-14-2014', 0, 0], ['10-19-2015', 0, 0]]
期望的结果:
[['10-14-2014',1,0],['10-19-2015',2,2]]
答案 0 :(得分:1)
它有助于简化代码。您可以在这里做的最好的事情是注意您使用此调用:
datetime.datetime.strptime(arg, '%m-%d-%Y')
四次,所有变化都是arg
的值。所以把它放在一个函数中:
def parse_date(datestamp):
return datetime.datetime.strptime(str(datestamp), '%m-%d-%Y')
您也可以直接对bool求助,而不是使用笨拙的sum(1 for item in ...)
。将它们组合在一起就可以得到:
for key, item in enumerate(Dates):
Dates[key].append(sum(parse_date(item[0]) > parse_date(item[0]) for item in Dates_Values))
Dates[key].append(sum(parse_date(item[1]) > parse_date(item[1]) for item in Dates_Values))
这使您的错误更容易被发现:您要比较的内容是相同的,因此总是相等。您似乎通过在外部循环和生成器表达式中重用名称item
来混淆自己 - 您希望每个比较的左侧使用外部item
,并且右侧使用内在的。你可以通过首先解析外部日期来解决这个问题(无论如何这是一个好主意),但最好避免像这样遮蔽变量,因为你不会总是< / em>能够做到这一点。此外,由于Dates[key]
在外部循环中只是item
,因此您实际上根本不需要使用enumerate
:
for item in Dates:
date = parse_date(item[0])
item.append(sum(date > parse_date(i[0]) for i in Dates_Values))
item.append(sum(date > parse_date(i[1]) for i in Dates_Values))
此外,Python惯例是变量和函数名称应该都是小写的 - 即dates
而不是Dates
等;首字母大写是为类名保留的。这不会影响您的代码如何工作,但它可以使您和其他人更容易阅读。
答案 1 :(得分:0)
基本上,我们想要转换Dates
的每个元素。所以这告诉我们我们想要开始:
Dates = [f(d) for d in Dates]
从那里我们可以建立f
:
def count(d, idx):
return sum(1 for item in Dates_Values if ...) # use item[idx] where
# you had item[0], item[1]
Dates = [[d, count(d, 0), count(d, 1)] for d in Dates]
我们当然可以写出count
内联的定义,就像你的方式一样,但对我而言,它的可读性要低得多:
Dates = [[d] + [sum(1 for item in Dates_Values if...) for idx in (0,1)]
for d in Dates]