【问题标题】:Check if a value exists in an array in Cython检查 Cython 的数组中是否存在值
【发布时间】:2013-02-26 16:56:27
【问题描述】:

我想知道如何检查数组中是否存在值或对象,例如在 python 中:

a = [1,2,3,4,5]
b = 4
if b in a:
    print("True!")
else:
    print("False")

我想知道 cython 中是否已经存在类似的东西。我有一个结构对象指针数组;我想知道该对象是否存在于该数组中。

喜欢

cdef Node *array

array = <Node *>malloc( 5 * cython.sizeof(Node))

for i in range(5):
     array[i].index = i

cdef Node test = array[3]

if test in array:
    print("True!")

cdef struct Node:
    int index

上面的代码不正确,但它说明了我的意思。

【问题讨论】:

    标签: c arrays cython


    【解决方案1】:

    您几乎必须遍历数组并检查每个元素。

    #include <stdbool.h>
    
    bool isvalueinarray(int val, int *arr, int size){
        int i;
        for (i=0; i < size; i++) {
            if (arr[i] == val)
                return true;
        }
        return false;
    }
    

    【讨论】:

    • 谢谢,就我而言,我认为这是最好的解决方案。我的数组很短,我必须在其中搜索很多次。每次排序和 bsearch 可能不会大大改善时间。非常感谢。
    【解决方案2】:

    尝试下一个:

    (阅读 cmets 和测试以了解其工作原理)

    #include <stdio.h>
    #include <assert.h>
    
    
    /*
    Return index an integer number begin from start an array,
    otherwise return -1.
     */
    int indexOf(int *array, int array_size, int number) {
        for (int i = 0; i < array_size; ++i) {
            if (array[i] == number) {
                return i;
            }
        }
        return -1;
    }
    
    
    // Tests for indexOf()
    void test_indexOf() {
        int array[10] = {12, 78, -43, 0, 21, 12, 20, -9, 1, -1};
        assert(indexOf(array, 10, 12) == 0);
        assert(indexOf(array, 10, 0) == 3);
        assert(indexOf(array, 10, 2) == -1);
        assert(indexOf(array, 10, 43) == -1);
        assert(indexOf(array, 10, 11) == -1);
        assert(indexOf(array, 10, -1) == 9);
        assert(indexOf(array, 10, 1) == 8);
        assert(indexOf(array, 10, -2) == -1);
        assert(indexOf(array, 10, 3) == -1);
    }
    
    
    int main () {
        test_indexOf();
        return 0;
    }
    

    注意事项:

    1. 由于 C 不支持重载函数,indexOf() 将仅适用于整数数组类型。

    2. C 不支持数组指针的确定长度。所以,你需要手动传递数组的大小。

    3. 测试环境:

    -

    $ uname -a
    Linux wlysenko-Aspire 3.13.0-37-generic #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
    $ gcc --version
    gcc (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-29
      • 2016-06-22
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      相关资源
      最近更新 更多