与filter()函数的细微差别

时间:2014-02-20 04:43:47

标签: python filter

我正在http://docs.python.org/2/library/functions.html阅读过滤器()文档。我不太明白下面显示的filter()函数产生的结果的细微差别。我试图让p& q列出尽可能相似的内容,以增强这种微妙的差异。

>>> p = ("A", "e", "I", "o", "U", "o")
>>> filter(lambda x: x not in ["e", "o"], p)
('A', 'I', 'U')
>>> q = ("Z", "o")
>>> filter(lambda x: x not in ["e", "o"], q)
('Z',)

有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:4)

这是因为('Z',)是一个元组,而('Z')只是一个括在括号中的字符串。

print type(('Z',))
# <type 'tuple'>

print type(('Z'))
# <type 'str'>

当您说('Z')时,Python认为它类似于(1 + 2)。它只是评估其中的表达式。

但是当你在('Z',)内放一个逗号时,它认为它是一个元组。

引自docs

  

带括号的表达式列表产生表达式列表   yield:如果列表包含至少一个逗号,则产生一个元组;   否则,它产生组成的单个表达式   表达列表。

     

一对空括号产生一个空元组对象。以来   元组是不可变的,文字规则适用(即两个   空元组的出现可能会也可能不会产生相同的对象。)

     

请注意,元组不是由括号组成,而是由使用   逗号运算符。例外是空元组,为此   必须使用括号 - 允许在中使用无括号的“无”   表达式会导致含糊不清并允许常见的拼写错误传递   未捕获

答案 1 :(得分:2)

作为元组的属性,

>>> ('a','b',) == ('a','b')
True


>>> ('a',) == ('a')
False

>>> ('a') in ('a',)
True

你指定的第一个和第二个过滤器的类型(不是我的)和('a','b')和('a',)都是元组,因此('a')不是元组和只是str

>>> type(('a','b',))
<type 'tuple'>
>>> type(('a','b'))
<type 'tuple'>
>>> type(('a',))
<type 'tuple'>
>>> type(('a'))
<type 'str'>
相关问题