python中的list()是什么?

时间:2016-07-08 20:44:34

标签: python list

我正在学习python并对下面的代码有疑问:

nums = { 1, 2, 3, 5, 6 } 
nums = { 0, 1, 2, 3 } & nums           # nums = { 1, 2, 3 }
nums = filter(lambda x: x > 1, nums)   # nums = { 2, 3 }
print(len(list(nums)))

此代码的结果必须为2。但为什么?我不明白这段代码。你能解释一下最后一行吗?我不明白list(nums)的作用。

3 个答案:

答案 0 :(得分:4)

nums = { 1, 2, 3, 4, 5, 6 }

包含1 - 6的集合。

nums = { 0, 1, 2, 3 } & nums

包含0 - 3和前一组的集合的intersection,因此{1,2,3}(两者共有的元素)。

nums = filter(lambda x: x > 1, nums)

filter删除了在作为第一个参数给出的callable传递时不返回true的元素。因此,它在这里删除了1条目,留下{2,3}。

现在你明白为什么长度是2。

答案 1 :(得分:3)

这样的问题是REPL可以派上用场的地方:

>>> nums = { 1, 2, 3, 5, 6 }
>>> nums
{1, 2, 3, 5, 6}
>>> nums = { 0, 1, 2, 3 } & nums
>>> nums
{1, 2, 3}
>>> nums = filter(lambda x: x > 1, nums)
>>> nums
<filter object at 0x101f465c0>
>>> list(nums)
[2, 3]

由此我们可以看到&将加入两个集合并采用两者的logical-AND共性(也称为交集或逻辑连接)。 filter接受一个函数(由lambda定义)并遍历集合,从过滤函数中删除任何不返回True的内容。

要了解lambda的工作原理,我们也可以使用解释器:

>>> f = (lambda x: x > 1)
>>> f(0)
False
>>> f(1)
False
>>> f(2)
True

在这种情况下,我们为f分配一个函数,一个取值并返回一个布尔值,表示它是否大于或小于1。函数式编程模式,例如filter,在这种形式中使用函数很多:lambda是你如何定义这样一个函数,它可以以内联形式用于创建一个'匿名'函数(即,一个未赋予名称的函数。)

最后一点,因为您提供的序列不清楚:

>>> nums = { 1, 2, 3, 5, 6 }
>>> nums = { 0, 1, 2, 3 } & nums
>>> nums = filter(lambda x: x > 1, nums)  # This is NOT a collection
>>> len(list(nums))  # This returns the expected result
2
>>> len(list(nums))  # !!! What happened?
0

请注意,一旦您通过调用list函数将filter object应用于filter,该对象将被清空。再次对该对象调用list将导致不返回任何内容。

答案 2 :(得分:2)

&给出了两组的交集。也就是说,

{ 1, 2, 3, 4, 5, 6 } & { 0, 1, 2, 3 } == { 1, 2, 3 }

lambda是一个匿名函数。它类似于代码

def func(x):
    return x > 1

filter(func, nums)

filter遍历nums并调用每个lambda函数。如果lambda函数返回True,则该元素将包含在返回的集合中。

list()将迭代转换为列表类型。

len()返回列表中的元素数。