2013-07-19 15 views
6

Mam mały problem z listą. Więc mam listę o nazwie l:Python 2: AttributeError: obiekt 'list' nie ma atrybutu 'strip'

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

I jak widać mam tylko 2 ciągi w moim liście. Chcę oddzielić moją listę l przez "; ' i umieść moje nowe 5 ciągów w nowej liście o nazwie l1.

Jak mogę to zrobić?

A także starałem się zrobić to tak:

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

Ale Python dać mi błąd:

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

Więc jeśli 'list' obiekt ma atrybut 'pas' lub ' split ", jak mogę podzielić listę?

Dzięki

+3

Nawiasem mówiąc, '' l1' L' i to tylko o najgorszym zmiennej nazwy, których możesz użyć; proszę nie używać ich w prawdziwym kodzie. :) – geoffspear

+0

Lista jest już podzielona na elementy listy ... – SethMMorton

Odpowiedz

14

strip() to metoda na smyczki, dzwonisz go na list, stąd błąd.

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

Aby zrobić to, co chcesz, zrób

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

Ponieważ chcesz być elementy w jednym liście (i nie jest to lista list), masz dwie opcje.

  1. Utwórz pustą listę i dołącz do niej elementy.
  2. Spłaszczyć listę.

Aby wykonać pierwszy, wykonaj kod:

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

zrobić drugi, użyj 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

Tak, ale potrzebuję na liście L1 wyglądać tak: l1 = ['Facebook', 'Google+', 'MySpace', 'Apple', 'Android '] –

+0

Jaka powinna być twoja produkcja? Lista list jest wystarczająco dobra, jak sądzę. –

+0

@MishaVayvala: Edytowałem odpowiedź. To powinno być tym, czego teraz chcesz. –

0

można podzielić ciąg wpisu na liście. l [0].pasek()

0

Podział struny, a następnie użyć chain.from_iterable połączyć je w jedną listę

>>> 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

ta powinna być, co chcesz:

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

wyjściowa:

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

Co chcesz zrobić -

strtemp = ";".join(l) 

Pierwsza linia dodaje ; do końca MySpace tak, że podczas podziału, to nie dać się MySpaceApple To przyłączenia l na jednej strunie, a następnie można just-

l1 = strtemp.split(";") 

to działa bo strtemp jest ciąg, który .split()

+0

Coś jest nie tak z Twoim kodem. Uruchomiłem go i otrzymałem tylko 4 z 5 pozycji, które powinienem mieć. Z jakiegoś powodu brakuje "Apple". – iCodez

+0

Czekaj, pozwól mi to sprawdzić. Wrócę. – svineet

+0

Oh, to dlatego, że tam nie ma "; po MySpace. Pozwól mi poprawić kod. – svineet

2

Hope this helps :)

>>> 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

Dziękuję za doskonały podział! x = [i.split (";") dla i in l] podzielił listę, ale jakie jest użycie dla z = [j dla i w x dla j in i]? Jaka jest różnica między X i Z? – Zong

1

Jednym z możliwych rozwiązań Próbowałem teraz jest: (Upewnij się zrobić to w sposób ogólny użyciem, zaś z indeksu)

>>> 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']