2011-10-02 15 views
7

ho lista di stringhepitone: la creazione di lista da stringa

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

vorrei creare un elenco

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

E 'questo un modo semplice per fare questo?

risposta

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 Non sono sicuro se lei è grave o no! ;-) Non sembra tutto ciò che è Pythonico. Le comprensioni delle liste hanno il loro posto ma possono essere esagerate dal mio punto di vista. O forse è solo la mia mancanza di familiarità con loro. –

+0

Sicuramente serio! È molto leggibile. Penso che questo sia un classico esempio in cui le list comprehensions * possono * essere usate, ma alla fine non sono il modo migliore per andare. – user

+0

Credo che sia una questione di stile, preferisco di gran lunga la comprensione delle liste! – wim

6

Prova questo:

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

Se avete bisogno di convertire alcuni di loro ai numeri e non si sa in anticipo quali, sarà necessario un po 'di codice aggiuntivo. Prova qualcosa del genere:

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) 

Questo è più lungo delle altre risposte, ma è più versatile.

2

più concisa rispetto ad altri:

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

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

In alternativa, se il formato è fisso come <string>, <int>, <int>, si può essere ancora più conciso:

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

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

So che questo è vecchio, ma qui è un una sola lista di corrispondenza:

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(', ')] 
Problemi correlati