加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python:list comprehensions vs. lambda

发布时间:2020-12-20 12:29:57 所属栏目:Python 来源:网络整理
导读:我想从包含“b”的子列表中检索整数值作为第一个元素(b只会在列表中出现一次) 我想到了这两种方式: foo = [["a",5],["b",10],["c",100]]y = filter(lambda x: x[0] == "b",foo)print y[0][1]z = [foo[i][1] for i in range(len(foo)) if foo[i][0] == "b"]
我想从包含“b”的子列表中检索整数值作为第一个元素(b只会在列表中出现一次)

我想到了这两种方式:

foo = [["a",5],["b",10],["c",100]]

y = filter(lambda x: x[0] == "b",foo)
print y[0][1]

z = [foo[i][1] for i in range(len(foo)) if foo[i][0] == "b"] 
print z[0]

他们都工作.是两个中的任何一个(关于运行时),是否有更好的第三种方式?

解决方法

当列表如此之小时,两者之间没有显着差异.如果输入列表变大,则会出现更糟糕的问题:您在整个列表上进行迭代,而您可以在第一个元素处停止.您可以使用for循环来完成此操作,但是如果您想使用类似于类似理解的语句,那么这里有生成器表达式:

# like list comprehensions but with () instead of []
gen = (b for a,b in foo if a == 'b')
my_element = next(gen)

或者干脆:

my_element = next(b for a,b in foo if a == 'b')

如果您想了解有关生成器表达式的更多信息,请查看PEP 289.

请注意,即使使用生成器和迭代器,您也有多个选择.

# Python 3:
my_element = next(filter(lambda x: x[0] == 'b',foo))

# Python 2:
from itertools import ifilter
my_element = next(ifilter(lambda (x,y): x == 'b',foo))

我个人不喜欢也不推荐这个,因为它的可读性低得多.事实证明,这实际上比我的第一个片段慢,但在一些特殊情况下,通常使用filter()而不是生成器表达式可能会更快.

无论如何,如果您需要对代码进行基准测试,我建议使用the timeit module.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读