【发布时间】:2013-05-31 15:19:59
【问题描述】:
在某些情况下,我需要 python 语法来实现短路列表理解或生成器表达式。
这里是一个简单的列表推导,相当于python中的for循环:
my_list = [1, 2, 3, 'potato', 4, 5]
[x for x in my_list if x != 'potato']
result = []
for element in my_list:
if element != 'potato':
result.append(element)
该语言不支持短路的理解。建议的语法,以及 python 中的等效 for 循环:
[x for x in my_list while x != 'potato']
# --> [1, 2, 3]
result = []
for element in my_list:
if element != 'potato':
result.append(element)
else:
break
它应该适用于任意迭代,包括无限序列,并且可以扩展到生成器表达式语法。我知道list(itertools.takewhile(lambda x: x != 'potato'), my_list) 是一个选项,但是:
- 它并不是特别像 Python 那样 - 不如 while 理解那么可读
- 它可能不如 CPython 理解那么高效或快速
- 它需要一个额外的步骤来转换输出,而这可以直接放入一个理解中,例如
[x.lower() for x in mylist] - 甚至是original author doesn't seem to like it much。
我的问题是,对于为什么将语法扩展到这个用例不是一个好主意,是否存在任何理论上的问题,或者它只是不可能,因为 python 开发人员认为它很少有用?这似乎是对语言的一个简单补充,也是一个有用的功能,但我可能忽略了一些隐藏的微妙之处或复杂性。
【问题讨论】:
-
result = []; any(x=='potato' or result.append(x) for x in my_list)。嗯...不,我认为这比服用时更糟:) -
我认为您更有可能在python-dev 邮件列表中获得好的答案。
-
@gnibbler:您刚刚实现了
filterfalse,OP 希望在找到第一个“土豆”后停止所有附加。试试:found = []; result = []; any(x=='potato' and not found.append(x) or result.append(x) if not found else None for x in my_list) -
另一种语法建议:
[x if x != 'potato' else break for x in my_list] -
list(iter(iter(my_list).next, "potato"))大声说出来听起来很有趣
标签: python list-comprehension generator-expression