2013-07-07 4 views
7

Имея следующий гипотетический код:Быстрый массив строк - Cython

cdef extern from "string.h": 
    int strcmp(char* str1, char* str2) 

def foo(list_str1, list_str2): 
    cdef unsigned int i, j 
    c_arr1 = ?? 
    c_arr2 = ?? 
    for i in xrange(len(list_str1)): 
     for j in xrange(len(list_str2)): 
      if not strcmp(c_arr1[i], c_arr2[j]): 
       do some funny stuff 

есть какой-то способ, как конвертировать списки в С массивами?

Я прочитал и попробовал Cython - converting list of strings to char **, но это только порождает ошибки.

ответ

9

Попробуйте ввести код. to_cstring_array Функция в следующем коде - это то, что вы хотите.

from libc.stdlib cimport malloc, free 
from libc.string cimport strcmp 
from cpython.string cimport PyString_AsString 

cdef char ** to_cstring_array(list_str): 
    cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *)) 
    for i in xrange(len(list_str)): 
     ret[i] = PyString_AsString(list_str[i]) 
    return ret 

def foo(list_str1, list_str2): 
    cdef unsigned int i, j 
    cdef char **c_arr1 = to_cstring_array(list_str1) 
    cdef char **c_arr2 = to_cstring_array(list_str2) 

    for i in xrange(len(list_str1)): 
     for j in xrange(len(list_str2)): 
      if i != j and strcmp(c_arr1[i], c_arr2[j]) == 0: 
       print i, j, list_str1[i] 
    free(c_arr1) 
    free(c_arr2) 

foo(['hello', 'python', 'world'], ['python', 'rules']) 
+0

Ну, это замечательный ответ! Большое спасибо за это, но теперь дело в том, что строка ret [i] = PyString_AsString (list_str [i]) повышает получение char * из временного значения Python во время компиляции – Jendas

+0

Хорошо, мое плохое! Я забыл от cpython.string cimport PyString_AsString. Теперь все работает отлично! Спасибо!! – Jendas

Смежные вопросы