清单列表 - 列表理解

时间:2015-01-12 03:56:06

标签: python python-2.7 list-comprehension

我想迭代列表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]]

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]