2015-12-05 36 views
11

Tôi có một danh sách các hình thức sau đây:Danh sách Python có thể được cắt như thế nào để cột được chuyển thành cột phần tử riêng biệt?

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

Tôi muốn cắt ra cột đầu tiên và thêm nó như là một yếu tố mới để mỗi dòng dữ liệu (như vậy tại mỗi vị trí lẻ trong danh sách), thay đổi theo mẫu sau:

[[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],] 

Tôi làm cách nào để thực hiện việc này?

Cho đến nay, tôi đã chiết xuất các thông tin cần thiết theo các cách sau:

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

Không hoàn toàn trùng lặp, nhưng hãy xem [tại đây] (http://stackoverflow.com/questions/34057294/flat-list-as-a-result-of-list-comprehension). – TigerhawkT3

Trả lời

2

Hãy thử điều này:

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

Output:

Danh sách
[[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

Thay vì giải nén, bạn có thể sử dụng 'list (itertools.chain.from_iterable ([danh sách ((phần tử [1:], [phần tử [0]])) cho phần tử trong l]))' – SIslam

5

Cố gắng lập chỉ mục và sau đó bị san phẳng list- tôi sử dụng danh sách hiểu cho phẳng.

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

Chỉ oneliner thay thế -

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

Điều này rất gần, nhưng bạn cần phải làm phẳng kết quả. – DSM

+1

Và làm thế nào về một lời giải thích? – TigerhawkT3

2

Slice mỗi sublist và thực hiện một mới list với một yếu tố cho mỗi lát:

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] 
.210
+0

Sử dụng bản in trên danh sách hiểu làm cho nó khá khó khăn để quét. Sử dụng hai dòng và việc in tách ra sẽ dễ dàng hơn trên mắt. Ngoài ra, bạn có thể sử dụng 'pprint'. –

4

comprehensions là tốt đẹp, nhưng có thể là một chút khó khăn để quét. Vòng vẫn còn hữu ích, đặc biệt là khi kết hợp với extend:

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

bây giờ:

import pprint  
pprint.pprint(res) 

in:

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

Câu trả lời hay nhất chỉ vì bạn chưa sử dụng một danh sách hiểu ... '[r.extend ((el [1:], el [: 1])) cho r trong [[]] cho el trong tập dữ liệu]; print r' – gboffi

+0

@gboffi Rất hay. Nhưng nó không hoạt động trong Python 3 vì 'r' không được định nghĩa sau khi hiểu danh sách. Bạn sẽ cần hai dòng 'res = []; [res.extend ([mục [1:], mục nhập [: 1]]) cho mục nhập trong tập dữ liệu] '.Việc hiểu danh sách với các tác dụng phụ không thực sự tốt đẹp. Thông thường bạn muốn có một giá trị trả về hữu ích. –

+0

Vâng, tôi đã học về các tác dụng phụ trong việc hiểu danh sách của P2 một cách khó khăn ... cá nhân tôi rất vui vì hành vi mới và mã trong nhận xét của tôi chỉ là một trò đùa. – gboffi

1

Một Pythonic cách tiếp cận trong python 3.x sử dụng lặp đi lặp lại giải nén và 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

Đây là chỉ Python3. Việc giải nén '* j' không hoạt động trong Python 2. –

+0

@ MikeMüller Thật vậy, tôi đã quên đề cập đến, cảm ơn. – Kasramvd

Các vấn đề liên quan