मुख्य रूप से छाँटे गए एक पाइथन डिक्टेड () को प्रिंट करें


82

मैं एक फाइल को प्री-प्रिंटर (मानव पठनीयता के लिए) का उपयोग करके एक शब्दकोश में प्रिंट करना चाहूंगा, लेकिन पठनीयता को और बेहतर बनाने के लिए शब्दकोश को आउटपुट फाइल में कुंजी द्वारा क्रमबद्ध किया जाना चाहिए। इसलिए:

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

वर्तमान में प्रिंट करता है

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

मैं शब्दकोश को सुंदर बनाना चाहता हूं, लेकिन क्या यह महत्वपूर्ण जैसे छांटे गए हैं।

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

इसे करने का बेहतरीन तरीका क्या है?

python 

कुंजी द्वारा पहले से ही छंटनी को चालू करता है। अधिक ध्यान से जाँच की जानी चाहिए।

जवाबों:


94

वास्तव में python2.5 के तहत pprint आपके लिए कुंजियों को क्रमबद्ध करने लगता है

>>> 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}

लेकिन हमेशा अजगर 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}
>>> 

Pprint.py (2.5) के स्रोत कोड को पढ़कर यह शब्दकोश का उपयोग करने को क्रमबद्ध करता है

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

मल्टीलाइन या सिंगल लाइन के लिए

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

इससे पहले कि यह कुछ भी छापने का प्रयास करता है, इसलिए यदि आपका शब्दकोश ठीक तरह से पसंद करता है तो इसे ठीक से प्रिंट करना चाहिए। 2.4 में दूसरा छांटा हुआ () गायब है (तब मौजूद नहीं था) ताकि एक पंक्ति में छपी हुई वस्तुओं को छांटा न जाए।

तो यह जवाब python2.5 का उपयोग करता प्रतीत होता है, हालांकि यह सवाल में आपके आउटपुट को काफी स्पष्ट नहीं करता है।

पायथन 3 अपडेट

क्रमबद्ध कुंजियों द्वारा सुंदर प्रिंट (लैम्ब्डा x: x [0]):

for key, value in sorted(dict_example.items(), key=lambda x: x[0]): 
    print("{} : {}".format(key, value))

सॉर्ट किए गए मानों द्वारा बहुत अच्छा प्रिंट (लैम्ब्डा x: x [1]):

for key, value in sorted(dict_example.items(), key=lambda x: x[1]): 
    print("{} : {}".format(key, value))

पायथन 3, लैम्ब्डा अभिव्यक्ति समाधान चालाक है। स्पष्टता के लिए, मेरा मानना है कि (?) keyमें for key, value in ...से स्वतंत्र है keyमें key=lambda ...इस काम करता है के रूप में, for k,v in sorted(token_dict.items(), key=lambda x: x[0])लेकिन for k,v in sorted(token_dict.items(), k=lambda x: x[0])एक त्रुटि फेंकता है।
— विक्टोरिया स्टुअर्ट

19

एक अन्य विकल्प:

>>> mydict = {'a':1, 'b':2, 'c':3}
>>> import json

फिर अजगर 2 के साथ:

>>> print json.dumps(mydict, indent=4, sort_keys=True) # python 2
{
    "a": 1, 
    "b": 2, 
    "c": 3
}

या अजगर 3 के साथ:

>>> print(json.dumps(mydict, indent=4, sort_keys=True)) # python 3
{
    "a": 1, 
    "b": 2, 
    "c": 3
}

14

पायथन 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

अभिव्यक्ति dict_example.items()टुपल्स लौटाती है, जिसे बाद में हल किया जा सकता है sorted():

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

नीचे पायथन डिक्शनरी के मानों की क्रमबद्ध सामग्री को बहुत प्रिंट करने के लिए एक उदाहरण है।

for key, value in sorted(dict_example.items(), key=lambda d_values: d_values[1]): 
    print("{} : {}".format(key, value))

बहुत अच्छा। यहाँ पायथन डिक्शनरी के मानों की छांट की गई सामग्री को बहुत प्रिंट करने के लिए एक उदाहरण है:for key, value in sorted(dict_example.items(), key=lambda d_items: d_items[1]): print("{} : {}".format(key, value))
— स्कॉट स्किल्स

1
@ScottSkiles आप उत्तर को संपादित करते हैं और उसमें अपना उदाहरण जोड़ते हैं - मुझे लगता है कि इससे भविष्य के पाठकों को मदद मिलेगी
— redbeam_

13

पायथन pprintमॉड्यूल वास्तव में पहले से ही कुंजी द्वारा शब्दकोशों को सॉर्ट करता है। पायथन 2.5 से पहले के संस्करणों में, छँटाई केवल उन शब्दकोशों पर शुरू की गई थी जिनके सुंदर-मुद्रित प्रतिनिधित्व ने कई पंक्तियों को फैलाया था, लेकिन 2.5.X और 2.6.X में, सभी शब्दकोशों को क्रमबद्ध किया गया है।

आम तौर पर, हालांकि, यदि आप किसी फ़ाइल में डेटा संरचनाएं लिख रहे हैं और उन्हें मानव-पठनीय और लिखने योग्य बनाना चाहते हैं, तो आप एक वैकल्पिक प्रारूप जैसे कि YAML या JSON का उपयोग करने पर विचार कर सकते हैं। जब तक आपके उपयोगकर्ता खुद प्रोग्रामर नहीं होते हैं, तब तक वे कॉन्फ़िगरेशन या एप्लिकेशन स्टेट को बनाए रखते हैं, जिसके माध्यम से डंप pprintऔर लोड किया जाता है, evalयह एक निराशा और त्रुटि वाला कार्य हो सकता है।


2
btw, ast.literal_eval("{'a': 0, 'b': 1, 2: 'c'}")-> {2: 'c', 'a': 0, 'b': 1}तो वहाँ आवेग की कोई जरूरत नहीं है eval।
— jfs

हां और जाहिर तौर पर इस व्यवहार को बंद करने का कोई तरीका पेश नहीं करता है। एक या दो घंटे बर्बाद करके यह पता लगाने की कोशिश की जा रही है कि कुछ पर्पल सैंपल रिपोर्ट डेटा कीज़ पर क्यों सॉर्ट किए जा रहे थे।
— सामन्था एटकिंस

12

मैंने डाइचेस, लिस्ट और टुपल्स को अधिक पठनीय प्रारूप में मुद्रित करने के लिए निम्न फ़ंक्शन लिखा:

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

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)

5

मुझे आपकी वही समस्या थी। मैंने इस तरह से शब्दकोश में पास किए गए क्रमबद्ध फ़ंक्शन के साथ लूप के लिए उपयोग किया:

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

4

यह सुनिश्चित करने के लिए आप इसे थोड़ा बदल सकते हैं (जैसे कि डक्ट्स को आंतरिक रूप से सॉर्ट नहीं किया गया है), उदाहरण के लिए

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.