You can convert to the appropriate data type by using this convension
# single values
>>> a = (GLfloat)(1.0)
>>> a
c_float(1.0)
# arrays
>>> data = [1.0, 2.0, 3.0]
>>> a = (GLfloat * len(data))(*data)
>>> a
<__main__.c_float_Array_3 object at 0x106078e60>
# numpy (nicer than arrays
>>> import numpy
>>> data = numpy.array([1.0, 2.0, 3.0])
>>> a = (GLfloat * data.size)(*data)
>>> a
<__main__.c_float_Array_3 object at 0x108931b90>
>>> for val in a: print val
...
1.0
2.0
3.0
Be aware that using len(list) will only get you the first dimension.
This is why I prefer numpy, as you can simply use 'data.size' to get the entire size of the array.
Eg.
>>> a = [[1,2,3],[4,5,6]]
>>> len(a)
2
>>> a = numpy.array( a )
>>> len(a)
2
>>> a.size
6
This also applies for textures.
I've seen a lot of code converting numpy arrays to strings and then passing that to the image.set_data functions.
Don't do this!
Just pass a data array in the proper format.
Hope this helps =)
Cheers,
Adam