2011-10-02 7 views
7

tengo lista de cadenaspitón: creación de listas de cadena

a = ['word1, 23, 12','word2, 10, 19','word3, 11, 15'] 

Me gustaría crear una lista

b = [['word1',23,12],['word2', 10, 19],['word3', 11, 15]] 

Es esta una manera fácil de hacer esto?

Respuesta

22
input = ['word1, 23, 12','word2, 10, 19','word3, 11, 15'] 
output = [] 
for item in input: 
    items = item.split(',') 
    output.append([items[0], int(items[1]), int(items[2])]) 
+2

@Oliver No estoy seguro de si está hablando en serio o no! ;-) No parece todo eso Pythonic. Las comprensiones de listas tienen su lugar, pero pueden ser exageradas en mi opinión. O tal vez sea solo mi falta de familiaridad con ellos. –

+0

¡Definitivamente serio! Es muy legible Creo que este es un ejemplo clásico donde la lista de comprensiones * puede * usarse, pero al final no es la mejor manera de hacerlo. – user

+0

¡Es una cuestión de estilo, supongo, prefiero la comprensión de la lista! – wim

6

Prueba esto:

b = [ entry.split(',') for entry in a ] 
b = [ b[i] if i % 3 == 0 else int(b[i]) for i in xrange(0, len(b)) ] 
1

Si usted necesita para convertir algunos de ellos a los números y no sabe de antemano cuáles, se necesitará algo de código adicional. Pruebe algo como esto:

b = [] 
for x in a: 
    temp = [] 
    items = x.split(",") 
    for item in items: 
     try: 
      n = int(item) 
     except ValueError: 
      temp.append(item) 
     else: 
      temp.append(n) 
    b.append(temp) 

Esto es más largo que las otras respuestas, pero es más versátil.

2

más concisa que otros:

def parseString(string): 
    try: 
     return int(string) 
    except ValueError: 
     return string 

b = [[parseString(s) for s in clause.split(', ')] for clause in a] 

Alternativamente, si el formato es fijo como <string>, <int>, <int>, puede ser aún más concisa:

def parseClause(a,b,c): 
    return [a, int(b), int(c)] 

b = [parseClause(*clause) for clause in a] 
1

Sé que esto es viejo, pero aquí está una una comprensión de la lista del trazador de líneas:

data = ['word1, 23, 12','word2, 10, 19','word3, 11, 15'] 

[[int(item) if item.isdigit() else item for item in items.split(', ')] for items in data] 

o

[int(item) if item.isdigit() else item for items in data for item in items.split(', ')] 
Cuestiones relacionadas