我有一个列表和一个像这样的过滤器:
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'值?
答案 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']]
>>>