【问题标题】:Why can't I detect that the tuple is empty?为什么我检测不到元组是空的?
【发布时间】:2014-04-29 17:04:14
【问题描述】:

我正在使用 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 的新手,并且是一般的编程人员。

【问题讨论】:

    标签: python arrays numpy tuples


    【解决方案1】:

    命名法:

    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。

    【讨论】:

    • 这里不需要map(len...,只需any(my_tuple) 就可以了!
    • 我不确定any(my_tuple) 是否适用于这种特定情况,因为元组的元素是numpy 数组,不能直接在布尔上下文中使用。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-14
      • 2012-01-05
      • 1970-01-01
      • 2011-11-07
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 2022-06-13
      相关资源
      最近更新 更多