En Python 2.7 puedo crear una serie de caracteres como este:

#Python 2.7 - works as expected
from array import array
x = array('c', 'test')

Pero en Python 3 'c' ya no es un código de tipo disponible. Si quiero una variedad de personajes, ¿qué debo hacer? El tipo 'u' también se está eliminando.

#Python 3 - raises an error
from array import array
x = array('c', 'test')

TypeError: no puede usar un str para inicializar una matriz con el código de tipo 'c'

7
C_Z_ 10 may. 2016 a las 18:03

3 respuestas

La mejor respuesta

Use una matriz de bytes 'b', con codificación hacia y desde una cadena unicode.

Convierta hacia y desde una cadena usando array.tobytes().decode() y array.frombytes(str.encode()).

>>> x = array('b')
>>> x.frombytes('test'.encode())
>>> x
array('b', [116, 101, 115, 116])
>>> x.tobytes()
b'test'
>>> x.tobytes().decode()
'test'
6
Mark Perryman 10 may. 2016 a las 15:21

Parece que los desarrolladores de Python ya no admiten el almacenamiento de cadenas en matrices, ya que la mayoría de los casos de uso usarían el nuevo interfaz bytes o { {X1}}. La solución @ MarkPerryman parece ser su mejor opción, aunque podría hacer que .encode() y .decode() sean transparentes con una subclase:

from array import array

class StringArray(array):
    def __new__(cls,code,start=''):
        if code != "b":
            raise TypeError("StringArray must use 'b' typecode")
        if isinstance(start,str):
            start = start.encode()
        return array.__new__(cls,code, start)

    def fromstring(self,s):
        return self.frombytes(s.encode())
    def tostring(self):
        return self.tobytes().decode()

x = StringArray('b','test')
print(x.tostring())
x.fromstring("again")
print(x.tostring())
4
Tadhg McDonald-Jensen 14 dic. 2017 a las 14:15

Gracias por Mark Perryman:

>>> x = array('b')
>>> x.frombytes('test'.encode())
>>> x
array('b', [116, 101, 115, 116])
>>> x.tobytes()
b'test'
>>> x.tobytes().decode()
'test'

Adicional:

>> x.frombytes('hellow world'.encode())
>>> x
array('b', [116, 101, 115, 116, 104, 101, 108, 108, 111, 119, 32, 119, 111, 114, 108, 100])
>>> x.tostring()
b'testhellow world'
>>> x[1]
101
>>> x[1]^=0x1
>>> x[1]
100

>> x.tobytes().decode()
'wdsthellow world'
>>> x.tobytes
<built-in method tobytes of array.array object at 0x11330b7b0>
>>> x.tobytes()
b'wdsthellow world'

Exactamente, necesito convertir un byte especial de mi lista de arreglos recientemente, ha probado varios métodos, luego obtenga el nuevo método simple: x[1]^=0x1, y podría obtener una matriz fácilmente a través de array.array['b', <my bytes list>]

0
Angellaugh 10 mar. 2019 a las 02:22