Cadena de ejemplo:

"{1#2#3,4#5#6,7#8#9,10#11#12}"

Quiero esto como una matriz / lista 2D. me gusta -

[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  [10, 11, 12]
]

¿Cuál es la forma más elegante de hacer esto en Python?

He tratado de separarme primero en base a ','. Entonces consigo una lista. para cada artículo en ascensor, lo dividí en '#' De esta manera puedo hacerlo. Pero quiero una forma limpia de hacerlo.

-1
user3903448 11 may. 2016 a las 11:54

7 respuestas

La mejor respuesta
>>> s="{1#2#3,4#5#6,7#8#9,10#11#12}"
>>> list(map(lambda x:list(map(int, x.split('#'))), s.strip('{}').split(',')))
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

Esto es lo que sucede en cada paso:

>>> s
'{1#2#3,4#5#6,7#8#9,10#11#12}'
>>> s.strip('{}')
'1#2#3,4#5#6,7#8#9,10#11#12'
>>> s.strip('{}').split(',')
['1#2#3', '4#5#6', '7#8#9', '10#11#12']
>>> list(map(lambda x:x.split('#'), s.strip('{}').split(',')))
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10', '11', '12']]
5
riteshtch 11 may. 2016 a las 09:04

Una manera simple es usar una lista de comprensión:

[list(map(int, sub.split('#'))) for sub in s.strip('{}').split(',')]
0
Matthias Schreiber 11 may. 2016 a las 09:17
s = "{1#2#3,4#5#6,7#8#9,10#11#12}"
print(list(map(str.split, s.strip("{}").replace("#"," ").split(",")))
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10', '11', '12']]

O una lista de compilación y envío a int si realmente quieres ints:

print([list(map(int,_s.split("#"))) for _s in  s.strip("{}").split(",")])
1
Padraic Cunningham 11 may. 2016 a las 09:14

En contraste con las respuestas existentes que usan map, propongo una comprensión de lista anidada:

[[int(x) for x in row.split("#")] for row in s.strip("{}").split(',')]

Ejemplo de uso:

s = "{1#2#3,4#5#6,7#8#9,10#11#12}"
l = [[int(x) for x in row.split("#")] for row in s.strip("{}").split(',')]
print(l)
# Output:  [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

Una alternativa un poco más corta sería combinar map y una comprensión de la lista:

[list(map(int, row.split("#"))) for row in s.strip("{}").split(',')]
0
Byte Commander 11 may. 2016 a las 09:15

Este es simple :)

Por

s="{1#2#3,4#5#6,7#8#9,10#11#12}"

[el.split('#') for el in s[1:-1].split(',')]

Puedes obtener

[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10', '11 ',' 12 ']]

0
marcin 11 may. 2016 a las 09:23

Use una combinación de re y numpy:

>>> import re
>>> import numpy as np
>>> s = "{1#2#3,4#5#6,7#8#9,10#11#12}"
>>> digits = re.findall('\d+', s)
>>> rows = s.count(',') + 1
>>> np.array(digits, dtype=int).reshape(rows, len(digits)/rows)
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
1
timgeb 11 may. 2016 a las 09:13

Menos ruidosa:

map(lambda x: map(int, x.split('#')), s.strip("{}").split(','))
1
haavee 11 may. 2016 a las 09:06