2015-12-05 6 views
11

Mam listę następującą postać:W jaki sposób lista Pythona może zostać podzielona tak, aby kolumna została przeniesiona do oddzielnej kolumny elementu?

[[0, 5.1, 3.5, 1.4, 0.2], 
[0, 4.9, 3.0, 1.4, 0.2], 
[0, 4.7, 3.2, 1.3, 0.2], 
[1, 4.6, 3.1, 1.5, 0.2], 
[1, 5.0, 3.6, 1.4, 0.2], 
[1, 5.4, 3.9, 1.7, 0.4], 
[1, 4.6, 3.4, 1.4, 0.3]] 

chcę pokroić na pierwszą kolumnę i dodać go jako nowy element do każdego wiersza danych (a więc w każdej pozycji nieparzyste na liście), zmiana w następujący sposób:

[[5.1, 3.5, 1.4, 0.2], [0], 
[4.9, 3.0, 1.4, 0.2], [0], 
[4.7, 3.2, 1.3, 0.2], [0], 
[4.6, 3.1, 1.5, 0.2], [1], 
[5.0, 3.6, 1.4, 0.2], [1], 
[5.4, 3.9, 1.7, 0.4], [1], 
[4.6, 3.4, 1.4, 0.3], [1],] 

Jak mogę to zrobić?

Do tej pory zostały wyodrębnione niezbędne informacje w jeden z następujących sposobów:

targets = [element[0] for element in dataset] 
features = dataset[1:] 
+0

Nie do końca duplikat, ale patrz [tutaj] (http://stackoverflow.com/questions/34057294/flat-list-as-a-result-of-list-comprehension). – TigerhawkT3

Odpowiedz

2

Spróbuj tego:

from itertools import chain 
print list(chain(*[list((element[1:],[element[0]])) for element in a])) 

wyjściowa:

[[5.1, 3.5, 1.4, 0.2], [0], [4.9, 3.0, 1.4, 0.2], [0], 
[4.7, 3.2, 1.3, 0.2], [0], [4.6, 3.1, 1.5, 0.2], [1], 
[5.0, 3.6, 1.4, 0.2], [1], [5.4, 3.9, 1.7, 0.4], [1], 
[4.6, 3.4, 1.4, 0.3], [1]] 
+0

Zamiast rozpakowywać możesz użyć 'list (itertools.chain.from_iterable ([list ((element [1:], [element [0]])) dla elementu w l]))' – SIslam

5

Spróbuj indeksowanie, a następnie uzyskać spłaszczone listy- użyłem listowych dla spłaszczenie.

>>>l=[[0, 5.1, 3.5, 1.4, 0.2], 
[0, 4.9, 3.0, 1.4, 0.2], 
[0, 4.7, 3.2, 1.3, 0.2], 
[1, 4.6, 3.1, 1.5, 0.2], 
[1, 5.0, 3.6, 1.4, 0.2], 
[1, 5.4, 3.9, 1.7, 0.4], 
[1, 4.6, 3.4, 1.4, 0.3]] 
>>>[[i[1:],[i[0]]] for i in l]#get sliced list of lists 
>>>[[[5.1, 3.5, 1.4, 0.2], [0]], [[4.9, 3.0, 1.4, 0.2], [0]], [[4.7, 3.2, 1.3, 0.2], [0]], [[4.6, 3.1, 1.5, 0.2], [1]], [[5.0, 3.6, 1.4, 0.2], [1]], [[5.4, 3.9, 1.7, 0.4], [1]], [[4.6, 3.4, 1.4, 0.3], [1]]] 
>>>d=[[i[1:],[i[0]]] for i in l] 
>>>[item for sublist in d for item in sublist]#flatten list d 
>>>[[5.1, 3.5, 1.4, 0.2], [0], [4.9, 3.0, 1.4, 0.2], [0], [4.7, 3.2, 1.3, 0.2], [0], [4.6, 3.1, 1.5, 0.2], [1], [5.0, 3.6, 1.4, 0.2], [1], [5.4, 3.9, 1.7, 0.4], [1], [4.6, 3.4, 1.4, 0.3], [1]] 

Wystarczy oneliner alternatywnego -

[item for sublist in [[i[1:],[i[0]]] for i in l] for item in sublist] #Here l is that list 
+2

Jest blisko, ale musisz spłaszczyć wynik. – DSM

+1

A co z wyjaśnieniem? – TigerhawkT3

2

Plasterek każdym podmenu i dokonać nowego list z elementem dla każdego segmentu:

l = [[0, 5.1, 3.5, 1.4, 0.2], 
[0, 4.9, 3.0, 1.4, 0.2], 
[0, 4.7, 3.2, 1.3, 0.2], 
[1, 4.6, 3.1, 1.5, 0.2], 
[1, 5.0, 3.6, 1.4, 0.2], 
[1, 5.4, 3.9, 1.7, 0.4], 
[1, 4.6, 3.4, 1.4, 0.3]] 

 

>>> print(*[item for sub in l for item in (sub[1:], [sub[0]])], sep='\n') 
[5.1, 3.5, 1.4, 0.2] 
[0] 
[4.9, 3.0, 1.4, 0.2] 
[0] 
[4.7, 3.2, 1.3, 0.2] 
[0] 
[4.6, 3.1, 1.5, 0.2] 
[1] 
[5.0, 3.6, 1.4, 0.2] 
[1] 
[5.4, 3.9, 1.7, 0.4] 
[1] 
[4.6, 3.4, 1.4, 0.3] 
[1] 
+0

Użycie wydruku na liście powoduje, że skanowanie jest raczej trudne. Używanie dwóch linii i oddzielenie od siebie byłoby łatwiejsze dla oka. Możesz również użyć 'pprint'. –

4

listowe są ładne, ale może być nieco trudne do skanowania. Pętle są wciąż użyteczne, zwłaszcza w połączeniu z extend:

res = [] 
for entry in dataset: 
    res.extend([entry[1:], entry[:1]]) 

się:

import pprint  
pprint.pprint(res) 

drukuje:

[[5.1, 3.5, 1.4, 0.2], 
[0], 
[4.9, 3.0, 1.4, 0.2], 
[0], 
[4.7, 3.2, 1.3, 0.2], 
[0], 
[4.6, 3.1, 1.5, 0.2], 
[1], 
[5.0, 3.6, 1.4, 0.2], 
[1], 
[5.4, 3.9, 1.7, 0.4], 
[1], 
[4.6, 3.4, 1.4, 0.3], 
[1]] 
+0

Najlepsza odpowiedź tylko dlatego, że nie masz użył rozumienia listy ... '[r.extend ((el [1:], el [: 1])) dla r w [[]] dla el w zbiorze danych]; drukuj r' – gboffi

+0

@ gboffi Nice try. Ale nie działa w Pythonie 3, ponieważ 'r' nie jest zdefiniowany po zrozumieniu listy. Będziesz potrzebował dwóch linii 'res = []; [res.extend ([entry [1:], entry [: 1]]) dla wprowadzenia w zbiorze danych] '.Zrozumienie listy z efektami ubocznymi nie jest naprawdę miłe. Zazwyczaj potrzebujesz użytecznej wartości zwracanej. –

+0

Cóż, dowiedziałem się o efektach ubocznych na listach P2 w sposób trudny ... osobiście jestem bardzo szczęśliwy z nowego zachowania, a kod w moim komentarzu był tylko żartem. – gboffi

1

pythonowy podejście pytona 3.X pomocą rozpakowania iteracji i itertools.chain:

>>> from itertools import chain 
>>> 
>>> list(chain.from_iterable([[j,[i]] for i,*j in A])) 
[[5.1, 3.5, 1.4, 0.2], [0], 
[4.9, 3.0, 1.4, 0.2], [0], 
[4.7, 3.2, 1.3, 0.2], [0], 
[4.6, 3.1, 1.5, 0.2], [1], 
[5.0, 3.6, 1.4, 0.2], [1], 
[5.4, 3.9, 1.7, 0.4], [1], 
[4.6, 3.4, 1.4, 0.3], [1]] 
+1

To jest tylko Python3. Rozpakowanie '* j' nie działa w Pythonie 2. –

+0

@ MikeMüller Rzeczywiście, chybiłem wspomnieć, dzięki. – Kasramvd