2014-04-05 17 views
7

Tôi có một danh sách các hàng:Cách sắp xếp danh sách các bộ dữ liệu theo phần tử đầu tiên của chúng?

self.gridKeys = self.gridMap.keys() # The keys of the instance of the GridMap (It returns the product of every possible combination of positions in the specified grid, in tuples.) 
print self.gridKeys 

self.gridKeys:

[(7, 3), (6, 9), (0, 7), (1, 6), (3, 7), (2, 5), (8, 5), (5, 8), (4, 0), (9, 0), (6, 7), (5, 5), (7, 6), (0, 4), (1, 1), (3, 2), (2, 6), (8, 2), (4, 5), (9, 3), (6, 0), (7, 5), (0, 1), (3, 1), (9, 9), (7, 8), (2, 1), (8, 9), (9, 4), (5, 1), (7, 2), (1, 5), (3, 6), (2, 2), (8, 6), (4, 1), (9, 7), (6, 4), (5, 4), (7, 1), (0, 5), (1, 0), (0, 8), (3, 5), (2, 7), (8, 3), (4, 6), (9, 2), (6, 1), (5, 7), (7, 4), (0, 2), (1, 3), (4, 8), (3, 0), (2, 8), (9, 8), (8, 0), (6, 2), (5, 0), (1, 4), (3, 9), (2, 3), (1, 9), (8, 7), (4, 2), (9, 6), (6, 5), (5, 3), (7, 0), (6, 8), (0, 6), (1, 7), (0, 9), (3, 4), (2, 4), (8, 4), (5, 9), (4, 7), (9, 1), (6, 6), (5, 6), (7, 7), (0, 3), (1, 2), (4, 9), (3, 3), (2, 9), (8, 1), (4, 4), (6, 3), (0, 0), (7, 9), (3, 8), (2, 0), (1, 8), (8, 8), (4, 3), (9, 5), (5, 2)] 

Sau khi sắp xếp:

self.gridKeys = self.gridMap.keys() # The keys of the instance of the GridMap (It returns the product of every possible combination of positions in the specified grid, in tuples.) 
self.gridKeys.sort() # They're dicts, so they need to be properly ordered for further XML-analysis. 
print self.gridKeys 

self.gridKeys:

[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)] 

Đầu tiên elem ent của mỗi tuple là "x", và thứ hai là "y". Tôi đang di chuyển các đối tượng trong danh sách qua lần lặp và sử dụng các phím này (Vì vậy, nếu tôi muốn di chuyển thứ gì đó trong trục x, tôi phải đi qua tất cả các cột và có thể gây ra vấn đề đáng lo ngại là tôi không có thể giải quyết).

Làm thế nào tôi có thể sắp xếp các bản ghi trong cách này ?:

[(1, 0), (2, 0), (3, 0), (4, 0), (5, 0), ...] 
+0

Nhưng đó không phải là sắp xếp chúng theo yếu tố đầu tiên của chúng, đó là phân loại theo phần tử * giây * của chúng, sau đó là phần tử đầu tiên của chúng. Đó có phải ý của bạn? –

+0

Tôi nghĩ rằng OP có nghĩa là 'yếu tố đầu tiên' là' phần tử ở chỉ số 1' – inspectorG4dget

+0

Tôi có nghĩa là chỉ số đầu tiên của mỗi tuple (Bây giờ tôi có một chút bối rối, nhưng danh sách cuối cùng xuống có "phân loại" mà tôi muốn đạt được). –

Trả lời

13

Bạn có thể sử dụng key tham số của sort chức năng, để sắp xếp các bộ. Chức năng của tham số key, là đưa ra một giá trị được sử dụng để so sánh hai đối tượng. Vì vậy, trong trường hợp của bạn, nếu bạn muốn sort để chỉ sử dụng các yếu tố đầu tiên trong tuple, bạn có thể làm một cái gì đó như thế này

self.gridKeys.sort(key=lambda x: x[0]) 

Nếu bạn muốn sử dụng chỉ là yếu tố thứ hai trong tuple, sau đó

self.gridKeys.sort(key=lambda x: x[1]) 

sort năng sẽ vượt qua mỗi và mọi phần tử trong danh sách với chức năng lambda bạn truyền như tham số và key nó sẽ sử dụng giá trị của nó, so sánh hai đối tượng đến trong danh sách. Vì vậy, trong trường hợp của bạn, cho phép nói rằng bạn có hai mục trong danh sách như thế này

data = [(1, 3), (1, 2)] 

và nếu bạn muốn sắp xếp theo yếu tố thứ hai, sau đó bạn sẽ làm gì

data.sort(key=lambda x: x[1]) 

Đầu tiên nó đi (1, 3) đối với hàm lambda trả về phần tử tại chỉ mục 1, là 3 và sẽ đại diện cho bộ tuple này trong khi so sánh. Theo cùng một cách, 2 sẽ được sử dụng cho bộ dữ liệu thứ hai.

3

này nên làm các trick

import operator 
self.gridKeys.sort(key=operator.itemgetter(1)) 
2

Trong khi giải pháp của thefourtheye đúng theo nghĩa nghiêm ngặt, đó chính xác là những gì bạn đã yêu cầu trong tiêu đề. Nó có thể không thực sự là những gì bạn muốn. Nó có thể là tốt hơn để đưa nó một chút xa hơn thông qua phân loại bằng cách đảo ngược của tuple để thay thế.

self.gridKeys.sort(key=lambda x:tuple(reversed(x))) 

Điều này buộc bạn phải có một trật tự như:

[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), ...] 

Thay vì phần tử đầu tiên được có thứ tự như sau:

[(4, 0), (9, 0), (6, 0), (1, 0), (3, 0), ...] 

Đó là những gì tôi nhận được khi sử dụng:

self.gridKeys.sort(key=lambda x: x[1]) 

Theo mặc định Py thon làm một loại từ điển từ trái sang phải. Đảo ngược tuple có hiệu quả làm cho Python làm loại từ điển từ phải sang trái.

+0

Tôi thấy rằng câu trả lời của ông không chính xác những gì tôi muốn, nhưng tôi đã tìm ra cách sử dụng nó .. Sử dụng cả [0] và 1]. self.gridKeys.sort (key = lambda x: x [0]) self.gridKeys.sort (key = lambda x: x [1]) Tôi sẽ phân tích phiên bản của bạn, cảm ơn bạn :) . –

+0

Tôi đã tìm thấy phiên bản của bạn thanh lịch hơn so với sử dụng cả [0] và [1] và tôi đang sử dụng nó :). –

+0

Tôi nghĩ bạn có thể. Chào mừng bạn. – Nuclearman

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