2009-09-25 31 views
60

Tôi muốn in từ điển python vào một tệp bằng PrettyPrinter (để dễ đọc) nhưng có từ điển được sắp xếp theo khóa trong tệp đầu ra để cải thiện khả năng đọc. Vì vậy:Có thể in ra từ điển python() được sắp xếp theo khóa

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

hiện in để

{'b':2, 
'c':3, 
'a':1} 

Tôi muốn prettyprint điển nhưng có nó in ra được sắp xếp theo ví dụ như chìa khóa.

{'a':1, 
'b':2, 
'c':3} 

Cách tốt nhất để làm điều này là gì?

+0

Tắt dấu trang đã sắp xếp theo khóa. Nên kiểm tra kỹ hơn. –

Trả lời

69

Trên thực tế pprint dường như sắp xếp các phím cho bạn dưới python2.5

>>> from pprint import pprint 
>>> mydict = {'a':1, 'b':2, 'c':3} 
>>> pprint(mydict) 
{'a': 1, 'b': 2, 'c': 3} 
>>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5} 
>>> pprint(mydict) 
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} 
>>> d = dict(zip("kjihgfedcba",range(11))) 
>>> pprint(d) 
{'a': 10, 
'b': 9, 
'c': 8, 
'd': 7, 
'e': 6, 
'f': 5, 
'g': 4, 
'h': 3, 
'i': 2, 
'j': 1, 
'k': 0} 

Nhưng không phải lúc nào dưới python 2,4

>>> from pprint import pprint 
>>> mydict = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5} 
>>> pprint(mydict) 
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4} 
>>> d = dict(zip("kjihgfedcba",range(11))) 
>>> pprint(d) 
{'a': 10, 
'b': 9, 
'c': 8, 
'd': 7, 
'e': 6, 
'f': 5, 
'g': 4, 
'h': 3, 
'i': 2, 
'j': 1, 
'k': 0} 
>>> 

Đọc mã nguồn của pprint.py (2.5) nó sắp xếp từ điển bằng cách sử dụng

items = object.items() 
items.sort() 

cho nhiều dòng hoặc đơn này cho một dòng

for k, v in sorted(object.items()): 

trước khi nó cố in bất kỳ thứ gì, vì vậy nếu từ điển của bạn sắp xếp chính xác như vậy thì nó sẽ được in chính xác. Trong 2.4, thứ hai được sắp xếp() bị thiếu (không tồn tại sau đó) để các đối tượng được in trên một dòng sẽ không được sắp xếp.

Vì vậy, câu trả lời dường như được sử dụng python2.5, mặc dù điều này không hoàn toàn giải thích đầu ra của bạn trong câu hỏi.

3

Bạn có thể biến đổi điều này một chút để đảm bảo rằng (vì dicts không được sắp xếp nội bộ), ví dụ:

pprint([(key, mydict[key]) for key in sorted(mydict.keys())]) 
12

Các Python pprint mô-đun thực đã phân loại từ điển bằng cách then chốt. Trong các phiên bản trước Python 2.5, việc sắp xếp chỉ được kích hoạt trên các từ điển có đại diện được in trên nhiều dòng, nhưng trong 2.5.X và 2.6.X, tất cả các từ điển đều được sắp xếp.

Nói chung, mặc dù, nếu bạn đang viết cấu trúc dữ liệu vào một tệp và muốn chúng có thể đọc được và có thể ghi được, bạn có thể cân nhắc sử dụng định dạng thay thế như YAML hoặc JSON. Trừ khi người dùng của bạn là những người lập trình, việc họ duy trì cấu hình hoặc trạng thái ứng dụng được bán thông qua pprint và được tải qua eval có thể là một tác vụ gây phiền toái và dễ bị lỗi.

+2

btw, 'ast.literal_eval (" {'a': 0, 'b': 1, 2: 'c'} ")' -> '{2: 'c', 'a': 0, 'b' : 1} 'do đó không cần thiết phải có 'eval'. – jfs

11

tôi đã viết các chức năng sau đây để in dicts, danh sách, và bản ghi trong một định dạng dễ đọc hơn:

def printplus(obj): 
    """ 
    Pretty-prints the object passed in. 

    """ 
    # Dict 
    if isinstance(obj, dict): 
     for k, v in sorted(obj.items()): 
      print u'{0}: {1}'.format(k, v) 

    # List or tuple    
    elif isinstance(obj, list) or isinstance(obj, tuple): 
     for x in obj: 
      print x 

    # Other 
    else: 
     print obj 

Ví dụ sử dụng trong ipython:

>>> dict_example = {'c': 1, 'b': 2, 'a': 3} 
>>> printplus(dict_example) 
a: 3 
b: 2 
c: 1 

>>> tuple_example = ((1, 2), (3, 4), (5, 6), (7, 8)) 
>>> printplus(tuple_example) 
(1, 2) 
(3, 4) 
(5, 6) 
(7, 8) 
3

tôi đã có vấn đề tương tự như bạn đã có.Tôi sử dụng một vòng lặp for với các chức năng được sắp xếp thông qua trong từ điển như vậy:

for item in sorted(mydict): 
    print(item) 
10

Một cách dễ dàng để in các nội dung sắp xếp các từ điển, bằng Python 3:

>>> dict_example = {'c': 1, 'b': 2, 'a': 3} 
>>> for key, value in sorted(dict_example.items()): 
... print("{} : {}".format(key, value)) 
... 
a : 3 
b : 2 
c : 1 

Khái niệm dict_example.items() lợi nhuận tuples, mà sau đó có thể được sắp xếp theo sorted():

>>> dict_example.items() 
dict_items([('c', 1), ('b', 2), ('a', 3)]) 
>>> sorted(dict_example.items()) 
[('a', 3), ('b', 2), ('c', 1)] 
+0

Rất đẹp. Dưới đây là một ví dụ để in các nội dung được sắp xếp của một giá trị từ điển Python: 'cho khóa, giá trị được sắp xếp (dict_example.items(), key = lambda d_items: d_items [1]): in (" {}: {} ".format (khóa, giá trị))' –

8

Một lựa chọn khác:

>>> mydict = {'a':1, 'b':2, 'c':3} 
>>> import json 
>>> print json.dumps(mydict, indent=4, sort_keys=True) 
{ 
    "a": 1, 
    "b": 2, 
    "c": 3 
} 
Các vấn đề liên quan