2011-09-08 66 views
8

Tôi biết có rất nhiều câu hỏi về danh sách phân loại/từ điển python, nhưng dường như tôi không tìm được từ nào giúp ích cho trường hợp của tôi và tôi đang tìm giải pháp hiệu quả nhất Tôi sẽ sắp xếp một tập dữ liệu khá lớn.Sắp xếp một từ điển các bộ dữ liệu bằng Python

Dữ liệu của tôi về cơ bản trông như thế này vào lúc này:

a = {'a': (1, 2, 3), 'b': (3, 2, 1)} 

tôi về cơ bản tạo ra một danh sách từ trong đó tôi lưu trữ mỗi từ cùng với một số liệu thống kê về nó (n, Sigma (x), Sigma (x^2))

Tôi muốn sắp xếp nó dựa trên một chỉ số cụ thể. Cho đến giờ tôi đã thử một số thứ dọc theo các dòng:

b = a.items() 
b.sort(key = itemgetter(1), reverse=True) 

Tôi không chắc cách kiểm soát chỉ mục nào được sắp xếp dựa trên danh sách các bộ dữ liệu có hiệu quả? Tôi đoán tôi có hiệu quả cần phải làm tổ hai hoạt động itemgetter nhưng không thực sự chắc chắn làm thế nào để làm điều này.

Nếu có cấu trúc dữ liệu tốt hơn tôi nên sử dụng thay vào đó, vui lòng cho tôi biết. Tôi có lẽ nên tạo một lớp nhỏ/struct và sau đó sử dụng một hàm lambda để truy cập vào một thành viên của lớp?

Rất cám ơn

Trả lời

4

Điều gì đó tương tự?

>>> a = {'a': (1, 2, 3), 'b': (3, 2, 1)} 
>>> b = a.items() 
>>> b 
[('a', (1, 2, 3)), ('b', (3, 2, 1))] 
>>> b.sort(key=lambda x:x[1][2]) # sorting by the third item in the tuple 
>>> b 
[('b', (3, 2, 1)), ('a', (1, 2, 3))] 
+0

có, hoàn hảo cảm ơn! Tuy nhiên tôi đọc một nơi nào đó mà itemgetter là nhanh hơn so với sử dụng một hàm lambda vì C của nó biên dịch? Nếu tôi không thể sử dụng itemgetter thì giải pháp này là tốt mặc dù. –

+0

Đừng lo lắng về hiệu suất cho đến khi bạn có một chương trình làm việc, hoàn thành với các bài kiểm tra đơn vị. Nếu cuối cùng, * chính xác *, chương trình là quá chậm, sau đó hồ sơ nó, và tối ưu hóa các bit chậm. –

+0

điểm tốt :) Tôi có thể viết lại nó trong C nếu nó quá chậm anyway, cảm ơn cho các con trỏ :) –

1

Names được dễ dàng hơn để làm việc với và nhớ rằng chỉ số, vì vậy tôi sẽ đi với một lớp:

class Word(object):  # don't need `object` in Python 3 
    def __init__(self, word): 
     self.word = word 
     self.sigma = (some calculation) 
     self.sigma_sq = (some other calculation) 
    def __repr__(self): 
     return "Word(%r)" % self.word 
    def __str__(self): 
     return self.word 
    @property 
    def sigma(self): 
     return self._sigma 
    @sigma.setter    # requires python 2.6+ 
    def sigma(self, value): 
     if not value: 
      raise ValueError("sigma must be ...") 
     self._sigma = value 

word_list = [Word('python'), Word('totally'), Word('rocks')] 
word_list.sort(key=lambda w: w.sigma_sq) 
+0

thats hữu ích cảm ơn! Đừng cho rằng bạn định nghĩa rõ ràng kiểu của mỗi biến trong lớp def? –

+0

@technosites Nếu theo 'loại của mỗi biến' bạn có nghĩa là int vs str vs float vv, bạn có thể sử dụng các thuộc tính để xác thực dữ liệu và whatnot. –

+0

yeah đó là ý tôi, cám ơn :) –

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