python过滤器抛出奇怪的错误

时间:2015-03-26 17:58:55

标签: python filter

我有一个列表和一个像这样的过滤器:

matrix = [['X', 'X', 'X'], ['X', 'X', 'X'], ['X', 'X', 'X'], ['O', 'X', 'X'], ['O', 'X', 'X']] 
s = list(zip(*matrix)[0])

print s[s != 'X']  

当我运行它时,它返回'X'

如果修改为:

matrix = [['X', 'X', 'X'], ['O', 'X', 'X'], ['X', 'X', 'X'], ['O', 'X', 'X'], ['O', 'X', 'X']] 
s = list(zip(*matrix)[0])

print s[s != 'X']  

然后返回'O'

我用google搜索/堆栈搜索它已经死亡但似乎无法找到正在发生的事情。我在这里错过了什么使得它不排除所有' X'值?

2 个答案:

答案 0 :(得分:1)

代码没有任何问题,它只提供正确的值。

当您运行第一个代码时,

>>> matrix = [['X', 'X', 'X'], ['X', 'X', 'X'], ['X', 'X', 'X'], ['O', 'X', 'X'], ['O', 'X', 'X']] 
>>> s = list(zip(*matrix)[0])

s的值是一个列表,

>>> print s
['X', 'X', 'X', 'O', 'O']

现在,当你将s与不等式的文字进行比较时,它显然会给你真实的

>>> s!= "X"
True

此True被内部视为s的索引,并转换为1:

>>> True == 1
True
>>> s[s!="X"]
'X'
>>> s[1]
'X'

在第二种情况下,s的值不同:

>>> matrix = [['X', 'X', 'X'], ['O', 'X', 'X'], ['X', 'X', 'X'], ['O', 'X', 'X'], ['O', 'X', 'X']] 
>>> s = list(zip(*matrix)[0])
>>> print s
['X', 'O', 'X', 'O', 'O']
>>> s[1]
'O'

因此打印"O"

答案 1 :(得分:1)

要正确过滤掉'X',请使用实际的filter功能。

>>>[filter(lambda x : x != 'X', sublist) for sublist in matrix]
[[], [], [], ['O'], ['O']]
>>>