为什么我无法检测到元组为空?
我正在使用numpy中的where函数,想在一个字符串数组中查找一个字母的字符串。比如说:我想在数组['B' 'U' 'A' 'M' 'R' 'O']
中查找'U'
,并获取'U'
的索引。
letter = 'U'
row = ['B', 'U', 'A', 'M', 'R', 'O']
letter_found = np.where(row == letter)
但是,当我查找一个不在这个字符串数组中的字母时,我得到的结果是一个空的元组,看起来像这样:
(array([], dtype=int64),)
我需要能够检测到在数组中找不到我想要的字母的情况。
我尝试了以下方法:
if not letter_found:
print 'not found'
但是这并没有奏效。我该如何判断numpy中的where函数返回的tuple
是否为空呢?是不是因为我的某个变量可能类型不对?我刚开始学习python
和编程。
2 个回答
4
你的测试失败了,因为 letter_found
实际上是一个包含一个元素的元组,所以它并不是空的。numpy.where
返回的是一个元组,里面包含了你正在测试的数组每个维度的索引值。通常在处理一维数组时,我会使用 Python 的元组解包功能,来避免这种情况发生:
letter = 'U'
row = ['B', 'U', 'A', 'M', 'R', 'O']
letter_found, = np.where(row == letter)
注意 letter_found
后面的逗号。这会将 numpy.where
的结果解包,并把 letter_found
赋值为那个元组的第一个元素。
还要注意的是,letter_found
现在会指向一个 numpy 数组,而这个数组不能直接用在布尔上下文中。你需要做一些类似于以下的操作:
if len(letter_found) == 0:
print('not found!')
16
术语解释:
if some_iterable:
#only if non-empty
这个方法只有在某个东西是空的时候才有效。在你的情况中,元组其实并不是空的。元组里面的内容是空的。所以你可能想要这样做:
if any(map(len, my_tuple)):
#passes if any of the contained items are not empty
因为对一个空的可迭代对象使用 len
会返回 0
,而 0
会被当作 False
来处理。