为什么我无法检测到元组为空?

9 投票
2 回答
12576 浏览
提问于 2025-04-18 04:47

我正在使用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 来处理。

撰写回答