我目前正在学习 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 中变成单行?
与 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))
如果顺序无关紧要:
dates = set(split[1] for split in (x.split() for x in some_list) if len(split) >= 3)
当然,如果你想要一个列表而不是一个集合,只需将结果传递给list()
.
虽然我可能会坚持你所拥有的,因为它更具可读性。
试试这个,假设你的 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)
在我看来,您正在拆分 中的每个元素some_list
,检查拆分元素是否有 3 个或更多部分,如果它不在列表中,则获取第二部分并将其附加到列表中。您可以将集合用于最后一种行为,因为集合仅包含唯一元素。
list(set((entry_split[1] for entry_split in (entry.split() for entry in some_list) if len(entry_split) >= 3]))
我将结果重新转换为列表,因为您使用了列表。
使用列表推导:
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'}