2013-07-19 7 views
6

Ho un piccolo problema con la lista. Così ho un elenco denominato l:Python 2: AttributeError: l'oggetto 'list' non ha attributo 'strip'

l = ['Facebook;Google+;MySpace', 'Apple;Android'] 

E come potete vedere ho solo 2 stringhe nella mia lista. Voglio separare la mia lista l da ';' e inserisci le mie nuove 5 stringhe in una nuova lista chiamata l1.

Come posso farlo?

E anche io ho cercato di farlo in questo modo:

l1 = l.strip().split(';') 

Ma Python darmi un errore:

AttributeError: 'list' object has no attribute 'strip' 

Quindi, se oggetto 'list' non ha alcun attributo 'strip' o ' split ', come posso dividere una lista?

Grazie

+3

A proposito, 'L' e' l1' sono solo sulla variabile peggiore nomi che puoi usare; per favore non usarli nel codice reale. :) – geoffspear

+0

Un elenco è già suddiviso tra gli elementi dell'elenco ... – SethMMorton

risposta

14

strip() è un metodo per le stringhe, che si sta chiamando su un list, da qui l'errore.

>>> 'strip' in dir(str) 
True 
>>> 'strip' in dir(list) 
False 

di fare quello che vuoi, basta fare

>>> l = ['Facebook;Google+;MySpace', 'Apple;Android'] 
>>> l1 = [elem.strip().split(';') for elem in l] 
>>> print l1 
[['Facebook', 'Google+', 'MySpace'], ['Apple', 'Android']] 

Dal momento che, si desidera gli elementi di essere in un unico elenco (e non una lista di liste), avete due opzioni.

  1. Creare una lista vuota e aggiungere elementi ad essa.
  2. Appiattisci l'elenco.

a fare la prima, seguono il codice:

>>> l1 = [] 
>>> for elem in l: 
     l1.extend(elem.strip().split(';')) 
>>> l1 
['Facebook', 'Google+', 'MySpace', 'Apple', 'Android'] 

a fare il secondo, utilizzare itertools.chain

>>> l1 = [elem.strip().split(';') for elem in l] 
>>> print l1 
[['Facebook', 'Google+', 'MySpace'], ['Apple', 'Android']] 
>>> from itertools import chain 
>>> list(chain(*l1)) 
['Facebook', 'Google+', 'MySpace', 'Apple', 'Android'] 
+0

sì, ma ho bisogno che l'elenco l1 assomigli a questo: l1 = ['Facebook', 'Google+', 'MySpace', 'Apple', 'Android '] –

+0

Come hai bisogno del tuo output? Una lista di liste è abbastanza buona, penso. –

+0

@MishaVayvala: ho modificato la risposta. Questo dovrebbe essere quello che vuoi ora. –

0

di dividere la voce di stringa della lista. l [0].strip()

0

Split le corde e quindi utilizzare chain.from_iterable per combinarle in un unico elenco

>>> import itertools 
>>> l = ['Facebook;Google+;MySpace', 'Apple;Android'] 
>>> l1 = [ x for x in itertools.chain.from_iterable(x.split(';') for x in l) ] 
>>> l1 
['Facebook', 'Google+', 'MySpace', 'Apple', 'Android'] 
2

questo dovrebbe essere ciò che si desidera:

[x for y in l for x in y.split(";")] 

uscita:

['Facebook', 'Google+', 'MySpace', 'Apple', 'Android'] 
1

Quello che vuoi fare è -

strtemp = ";".join(l) 

La prima riga aggiunge una ; alla fine del MySpace modo che, mentre la divisione, non dare fuori MySpaceApple Questo si unirà l in un'unica stringa e poi si può solo-

l1 = strtemp.split(";") 

questo funziona perché strTemp è una stringa che ha .split()

+0

C'è qualcosa che non va nel tuo codice. L'ho eseguito e ho recuperato solo 4 dei 5 elementi che dovrei avere. "Apple" manca per qualche motivo. – iCodez

+0

Aspetta, fammi controllare. Tornerò. – svineet

+0

Oh, questo perché non c'è ";" dopo MySpace. Fammi correggere il codice. – svineet

2

Spero che questo aiuti :)

>>> x = [i.split(";") for i in l] 
>>> x 
[['Facebook', 'Google+', 'MySpace'], ['Apple', 'Android']] 
>>> z = [j for i in x for j in i] 
>>> z 
['Facebook', 'Google+', 'MySpace', 'Apple', 'Android'] 
>>> 
+0

Grazie per l'eccellente spacco! x = [i.split (";") per i in l] ha diviso la lista, ma a cosa serve z = [j per i in x per j in i]? Qual è la differenza tra x e z? – Zong

1

Una possibile soluzione che ho provato in questo momento è: (Assicurarsi che lo fanno in modo generale che utilizzano per, mentre con l'indice)

>>> l=['Facebook;Google+;MySpace', 'Apple;Android'] 
>>> new1 = l[0].split(';') 
>>> new1 
['Facebook', 'Google+', 'MySpace'] 
>>> new2= l[1].split(';')`enter code here` 
>>> new2 
['Apple', 'Android'] 
>>> totalnew = new1 + new2 
>>> totalnew 
['Facebook', 'Google+', 'MySpace', 'Apple', 'Android']