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

时间:2014-04-29 17:04:15

标签: python arrays numpy tuples

我在numpy中使用where函数来查找字符串数组中的单字母字符串。 例如: 我会在'U'中查找['B' 'U' 'A' 'M' 'R' 'O']并获取'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'

但这不起作用。如何检测tuple中where函数返回的numpy是否为空?是因为我的一个变量可能是错误的类型?我是python的新人,也是一般的编程。

2 个答案:

答案 0 :(得分:11)

命名法:

 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,因此将转换为False

答案 1 :(得分:3)

您的测试失败,因为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!')