2012-06-29 62 views
60

Tôi gặp sự cố với dấu ngoặc vuông trong Python. Tôi đã viết một mã tạo ra kết quả sau:Làm phẳng danh sách các danh sách

[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 

Nhưng tôi muốn thực hiện một số phép tính với điều đó, nhưng các dấu ngoặc vuông sẽ không cho phép tôi.

Tôi làm cách nào để có thể xóa các dấu ngoặc vuông? Tôi thấy một số ví dụ để làm điều đó nhưng tôi không thể áp dụng chúng cho trường hợp này.

+2

Nói cách khác, bạn có một danh sách liệt kê và bạn muốn để có thể để làm việc trên tất cả các thành viên của danh sách bên trong? Ngoài ra, vì tất cả các danh sách bên trong đều có một giá trị, có đáng để đảm bảo rằng chỉ có giá trị được chèn vào danh sách ngoài không?Hoặc có thể một số danh sách có nhiều phần tử không? Điều quan trọng là cung cấp cho tất cả các thông tin có thể bạn có thể, càng chính xác càng tốt. –

+12

Để giúp mọi người trả lời câu hỏi của bạn trong tương lai, hãy cố gắng tránh các câu nói chung như "dấu ngoặc vuông sẽ không cho phép tôi" và thay vào đó đưa ra ví dụ cụ thể về thứ bạn đã cố gắng không làm việc và sao chép và dán một mã thử nghiệm nhỏ cho thấy lỗi kết quả. – DSM

+0

liên quan [flatten lồng nhau danh sách] (http://stackoverflow.com/q/952914/4279) – jfs

Trả lời

10

Với

d = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 

và bạn cụ câu hỏi:Làm thế nào tôi có thể loại bỏ các dấu ngoặc?

Sử dụng danh sách hiểu:

new_d = [i[0] for i in d] 

sẽ cung cấp cho bạn này

[180.0, 173.8, 164.2, 156.5, 147.2, 138.2] 

sau đó bạn có thể truy cập vào từng mục với chỉ số thích hợp, ví dụ, new_d[0] sẽ cung cấp cho bạn 180.0 vv mà bạn có thể sau đó sử dụng cho toán học.

Nếu bạn sắp có bộ sưu tập dữ liệu, bạn sẽ có một số loại khung hoặc dấu ngoặc đơn.

Lưu ý, giải pháp này nhằm vào câu hỏi/vấn đề của bạn, nó không cung cấp giải pháp tổng quát. Tức là, nó sẽ làm việc cho trường hợp của bạn.

+7

OP có ít ý tưởng về danh sách, cho anh ta/cô ấy này giải pháp có thể gây ra các hiệu ứng không mong muốn nếu anh ta muốn sử dụng nó để làm phẳng nhiều phần tử (không có lỗi, chỉ cần trả về âm thầm đầu tiên ...) – estani

113

Làm phẳng danh sách thành "xóa dấu ngoặc vuông" bằng cách sử dụng tính năng hiểu danh sách lồng nhau. Thao tác này sẽ hủy lưu trữ từng danh sách được lưu trữ trong danh sách danh sách của bạn!

list_of_lists = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 
flattened = [val for sublist in list_of_lists for val in sublist] 

comprehensions danh sách lồng nhau đánh giá theo cách tương tự mà họ unwrap (tức là thêm xuống dòng và tab cho mỗi vòng lặp mới Vì vậy, trong trường hợp này:.

flattened = [val for sublist in list_of_lists for val in sublist] 

tương đương với:

flattened = [] 
for sublist in list_of_lists: 
    for val in sublist: 
     flattened.append(val) 

Sự khác biệt lớn là danh sách comp đánh giá MUCH nhanh hơn vòng lặp chưa được làm sáng và loại bỏ các cuộc gọi nối thêm!

Nếu bạn có nhiều mục trong danh sách con, danh sách comp sẽ làm phẳng nó. tức là

>>> list_of_lists = [[180.0, 1, 2, 3], [173.8], [164.2], [156.5], [147.2], [138.2]] 
>>> flattened = [val for sublist in list_of_lists for val in sublist] 
>>> flattened 
[180.0, 1, 2, 3, 173.8, 164.2, 156.5, 147.2,138.2] 
+17

Sử dụng 'itertools.chain.from_iterable' đơn giản hơn rất nhiều. –

+4

Vui lòng giải thích lý do. Điều này là đơn giản vì nó được –

+5

Xin lỗi, tôi có nghĩa là dễ đọc hơn/trực quan hơn. Vì OP gặp khó khăn trong việc phân biệt giữa danh sách (chuỗi dữ liệu) và cách danh sách được biểu diễn bằng mã (với dấu ngoặc vuông), tôi rất nghi ngờ rằng việc hiểu danh sách kép sẽ có ý nghĩa đối với anh ta/cô ấy. –

2
>>> lis=[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 
>>> [x[0] for x in lis] 
[180.0, 173.8, 164.2, 156.5, 147.2, 138.2] 
80

Tôi sẽ sử dụng itertools.chain - điều này cũng sẽ phục vụ cho> 1 phần tử trong mỗi sublist:

from itertools import chain 
list(chain.from_iterable([[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]])) 
+0

+1 cho 'itertools', chỉ cần đăng một câu trả lời tương tự nhưng bạn đánh tôi với nó. –

+7

Tại sao bạn nhập toàn bộ mô-đun để làm điều gì đó đơn giản như thế này? –

+0

@PaulSeeb cách đơn giản nhất, chung chung, được xây dựng trong phương pháp làm phẳng một vòng lặp có thể lặp lại ... Điều gì xảy ra nếu các danh sách con có 100 phần tử? Tôi chắc chắn sẽ không muốn gõ mã listcomp cho cái đó ... –

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