2012-12-25 9 views
84

Tôi hơi bối rối về cấu trúc dữ liệu trong python; (), []{}. Tôi đang cố gắng để sắp xếp ra một danh sách đơn giản, có lẽ vì tôi không thể xác định loại dữ liệu tôi không thể sắp xếp nó.Danh sách sắp xếp cấu trúc dữ liệu Python theo thứ tự bảng chữ cái

danh sách của tôi rất đơn giản: ['Stem', 'constitute', 'Sedge', 'Eflux', 'Whim', 'Intrigue']

Câu hỏi của tôi là những gì kiểu dữ liệu này là gì, và làm thế nào để sắp xếp các từ theo thứ tự abc?

+0

Nếu bạn muốn sắp xếp danh sách, bạn có thể sử dụng "list = ['Stem', 'constitute', 'Sedge', 'Eflux', ' Whim ',' Intrigue '] list.sort() danh sách in ". – kannanrbk

+0

'[]' bao quanh kiểu dữ liệu dựng sẵn 'list', (xem http://www.tutorialspoint.com/python/python_lists.htm). Danh sách chỉ là các nhóm giá trị (chúng có thể chứa các đối tượng có thể lặp lại khác - tức là các danh sách lồng nhau). '()' bao quanh 'tuple' nội trang. Chúng không thay đổi (không thể thay đổi). (xem http://www.tutorialspoint.com/python/python_tuples.htm). Và '{}' bao quanh 'từ điển được tạo sẵn'. Song song với một từ điển (cho các từ), trong đó một 'khóa' sẽ là từ và 'giá trị là định nghĩa. (xem http://www.tutorialspoint.com/python/python_dictionary.htm). –

Trả lời

124

[] biểu thị một list, () biểu thị một tuple{} biểu thị một dictionary. Bạn nên xem qua số official Python tutorial vì đây là những điều cơ bản về lập trình bằng Python.

Những gì bạn có là danh sách các chuỗi. Bạn có thể sắp xếp nó như sau:

In [1]: lst = ['Stem', 'constitute', 'Sedge', 'Eflux', 'Whim', 'Intrigue'] 

In [2]: sorted(lst) 
Out[2]: ['Eflux', 'Intrigue', 'Sedge', 'Stem', 'Whim', 'constitute'] 

Như bạn có thể thấy, các từ bắt đầu bằng chữ in hoa được ưu tiên so với chữ bắt đầu bằng chữ thường. Nếu bạn muốn sắp xếp chúng một cách độc lập, làm việc này:

In [4]: sorted(lst, key=str.lower) 
Out[4]: ['constitute', 'Eflux', 'Intrigue', 'Sedge', 'Stem', 'Whim'] 

Bạn cũng có thể sắp xếp danh sách theo thứ tự ngược bằng cách làm này:

In [12]: sorted(lst, reverse=True) 
Out[12]: ['constitute', 'Whim', 'Stem', 'Sedge', 'Intrigue', 'Eflux'] 

In [13]: sorted(lst, key=str.lower, reverse=True) 
Out[13]: ['Whim', 'Stem', 'Sedge', 'Intrigue', 'Eflux', 'constitute'] 

Xin lưu ý: Nếu bạn làm việc với Python 3, sau đó str là loại dữ liệu chính xác cho mọi chuỗi chứa văn bản có thể đọc được của con người. Tuy nhiên, nếu bạn vẫn cần làm việc với Python 2, thì bạn có thể xử lý các chuỗi unicode có kiểu dữ liệu unicode trong Python 2 và không phải là str. Trong trường hợp này, nếu bạn có danh sách các chuỗi unicode, bạn phải viết key=unicode.lower thay vì key=str.lower.

+0

Sử dụng ví dụ thứ hai về kết quả 'find_one()' của pymongo từ một cơ sở dữ liệu MongoDB, tôi nhận được lỗi: 'descriptor 'lower' yêu cầu một đối tượng 'str' nhưng nhận được một 'unicode''. Kết quả là một chuỗi các chuỗi và được thực hiện như sau: 'results ['keywords'] = sắp xếp (từ khóa ['keywords'], key = str.lower)'. Có ai biết cách giải quyết vấn đề này không? – user1063287

+0

@ user1063287 Xin lỗi vì phản hồi muộn của tôi. Trong trường hợp của bạn, bạn cần phải viết 'key = unicode.lower' thay vì' key = str.lower'. Điều này là do bạn đang xử lý các chuỗi unicode, không phải chuỗi byte. Vui lòng tham khảo [HOWTO Unicode chính thức] (https://docs.python.org/3/howto/unicode.html) để biết thêm thông tin về điều này, đặc biệt là đối với sự khác biệt tương ứng giữa Python 2 và 3. – pemistahl

6

Bạn đang xử lý danh sách python và sắp xếp nó dễ dàng như việc này.

my_list = ['Stem', 'constitute', 'Sedge', 'Eflux', 'Whim', 'Intrigue'] 
my_list.sort() 
7

Bạn có thể sử dụng chức năng được tích hợp sẵn sorted.

print sorted(['Stem', 'constitute', 'Sedge', 'Eflux', 'Whim', 'Intrigue']) 
3
>>> a =() 
>>> type(a) 
<type 'tuple'> 
>>> a = [] 
>>> type(a) 
<type 'list'> 
>>> a = {} 
>>> type(a) 
<type 'dict'> 
>>> a = ['Stem', 'constitute', 'Sedge', 'Eflux', 'Whim', 'Intrigue'] 
>>> a.sort() 
>>> a 
['Eflux', 'Intrigue', 'Sedge', 'Stem', 'Whim', 'constitute'] 
>>> 
19

Python có chức năng built-in gọi sorted, mà sẽ cung cấp cho bạn một danh sách được sắp xếp từ bất kỳ Iterable bạn ăn nó (chẳng hạn như một danh sách ([1,2,3]); một dict ({1:2,3:4}, mặc dù nó sẽ chỉ trả lại một sắp xếp danh sách các phím; một bộ ({1,2,3,4);. hoặc một tuple ((1,2,3,4)))

>>> x = [3,2,1] 
>>> sorted(x) 
[1, 2, 3] 
>>> x 
[3, 2, 1] 

danh sách cũng có một phương pháp sort rằng sẽ thực hiện các loại tại chỗ

.

Cả hai cũng tham số đối số key, phải là một hàm có thể gọi (hàm/lambda) mà bạn có thể sử dụng để thay đổi thứ cần sắp xếp theo.
Ví dụ, để có được một danh sách các (key,value) -pairs từ một dict được sắp xếp theo giá trị mà bạn có thể sử dụng đoạn mã sau:

>>> x = {3:2,2:1,1:5} 
>>> sorted(x.items(), key=lambda kv: kv[1]) # Items returns a list of `(key,value)`-pairs 
[(2, 1), (3, 2), (1, 5)] 
+0

@ jwpat7, yeah . Tốt hơn? –

+0

Cảm ơn bạn đã thực sự giải thích cách nó hoạt động. Rất hữu ích. – joshmcode

3

ListName.sort() sẽ sắp xếp nó theo thứ tự abc. Bạn có thể thêm reverse=False/True vào dấu ngoặc để đảo ngược thứ tự của các mục: ListName.sort(reverse=False)

+0

Đây có phải là một nhận xét cho Ruby? – allanberry