Python列表迭代到单行程中

时间:2013-06-19 20:52:54

标签: python list

我正在学习Python。

我该怎么说:

dates = list()  
for entry in some_list:  
    entry_split = entry.split()    
    if len(entry_split) >= 3:  
        date = entry_split[1]
        if date not in dates:  
            dates.append(date)

进入Python的单线程?

5 个答案:

答案 0 :(得分:4)

使用3-liner而不是1-liner,可能更容易理解。

table = (entry.split() for entry in some_list)
raw_dates = (row[1] for row in table if len(row) >= 3)
# Uniquify while keeping order. http://stackoverflow.com/a/17016257
dates = list(collections.OrderedDict.fromkeys(raw_dates))

答案 1 :(得分:2)

如果订单无关紧要:

dates = set(split[1] for split in (x.split() for x in some_list) if len(split) >= 3)

当然,如果你想要一个列表而不是一个集合,只需将结果传递给list()

虽然我可能会坚持你拥有的东西,因为它更具可读性。

答案 2 :(得分:1)

试试这个,假设您的Python版本中提供了集合理解:

list({d[1] for d in (e.split() for e in some_list) if len(d) >= 3})

如果设置理解不可用,则可以使用:

list(set(d[1] for d in (e.split() for e in some_list) if len(d) >= 3))

但严重的是,由于评论中提到的原因,将此作为单行写入并不是一个好主意。即便如此,您的代码可以稍微改进一下,只要您需要从元素集合中删除重复项,就使用set

dates = set()
for entry in some_list:
    entr_split = entry.split()
    if len(entry_split) >= 3:
        dates.add(entry_split[1])
dates = list(dates)

答案 3 :(得分:1)

在我看来,你正在拆分some_list中的每个元素,检查拆分元素是否包含3个或更多部分,然后取出第二部分并将其附加到列表中(如果它不在名单。您可以为最后一个行为使用集合,因为集合仅包含唯一元素。

list(set((entry_split[1] for entry_split in (entry.split() for entry in some_list) if len(entry_split) >= 3]))

我将结果重新投射到列表中,因为您使用了列表。

答案 4 :(得分:0)

使用列表理解:

dates = set([entry.split()[1] for entry in some_list if len(entry.split()) >= 3])

给了我们想要的东西:

>>> some_list = [
... "a 2011-08-04 b",
... "x y",
... "e 2012-03-04 g"
... ]
>>> dates = set([entry.split()[1] for entry in some_list if len(entry.split()) >= 3])
>>> dates
{'2011-08-24', '2012-03-04'}