4

我目前正在学习 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 中变成单行?

4

5 回答 5

6

与 1-liner 相比,使用 3-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))
于 2013-06-19T21:11:38.953 回答
3

如果顺序无关紧要:

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

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

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

于 2013-06-19T20:57:54.840 回答
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只要您需要从元素集合中删除重复项,请使用 a :

dates = set()
for entry in some_list:
    entr_split = entry.split()
    if len(entry_split) >= 3:
        dates.add(entry_split[1])
dates = list(dates)
于 2013-06-19T20:57:45.507 回答
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]))

我将结果重新转换为列表,因为您使用了列表。

于 2013-06-19T21:05:04.743 回答
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'}
于 2013-06-19T21:03:18.997 回答