我正在学习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的单线程?
答案 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'}