पायथन में लाइन द्वारा एक डिक्शनरी लाइन कैसे प्रिंट करें?


166

यह शब्दकोश है

cars = {'A':{'speed':70,
        'color':2},
        'B':{'speed':60,
        'color':3}}

इसका उपयोग करना for loop

for keys,values in cars.items():
    print(keys)
    print(values)

यह निम्नलिखित प्रिंट करता है:

B
{'color': 3, 'speed': 60}
A
{'color': 2, 'speed': 70}

लेकिन मैं चाहता हूं कि कार्यक्रम इसे इस तरह से प्रिंट करे:

B
color : 3
speed : 60
A
color : 2
speed : 70

मैंने अभी शब्दकोशों सीखना शुरू किया है इसलिए मुझे यकीन नहीं है कि यह कैसे करना है।

जवाबों:


142
for x in cars:
    print (x)
    for y in cars[x]:
        print (y,':',cars[x][y])

उत्पादन:

A
color : 2
speed : 70
B
color : 3
speed : 60

12
मुझे पता है कि यह पुराना है, लेकिन मुझे लगा कि यह ध्यान देने योग्य होगा कि अगर कार [x] पूर्णांक नहीं है तो यह काम नहीं करेगा। ऐसा नहीं है कि ओपी अनुरोध कर रहा था, इसलिए मैं इसे किसी के लिए भी कह रहा हूं जो इस पर विचार करता है कि यह एक कंबल समाधान है।
डारेल होल्ट

@DarrelHolt क्या आप जानते हैं कि यह पूर्णांक के साथ कैसे काम करता है? क्योंकि यही वह समस्या है जिसका मैं वर्तमान में सामना कर रहा हूँ
Theprowler

@theprowler निकटतम मैं इस समस्या को पुनः बनाने के लिए प्राप्त कर सकते हैं है cars = {1:4, 2:5}तो cars[x]एक पूर्णांक कुंजी को मैप किया है xएक सेट कुंजी को मैप किया बजाय x। इस स्थिति में, आपको for y in cars[x]:लाइन का उपयोग करने की आवश्यकता नहीं है क्योंकि केवल एक ही मूल्य है जिसे आप पुनः प्राप्त कर रहे हैं, जब तक कि आप किसी सूची या पूर्णांक के सेट जैसी किसी चीज़ का उपयोग नहीं कर रहे हैं तब तक यह काम करना चाहिए। क्षमा करें, यह कुछ महीने रहा है इसलिए मुझे पूरी तरह से याद नहीं है कि मैं अपनी पिछली टिप्पणी के निष्कर्ष पर कैसे आया। आप मुझे अपना कोड भेज सकते हैं और मैं देख सकता हूं कि क्या मैं कोई मदद कर सकता हूं।
डारेल होल्ट

हम्म। मुझे लगता है कि मेरी समस्या इससे भी बदतर है। मूल रूप से मैंने एक HTML तालिका से कुछ डेटा पार्स किया है, और मैंने इसे एक शब्दकोश में संग्रहीत करने के लिए हुआ है, और अब मैं उस शब्दकोश डेटा को लेने की कोशिश कर रहा हूं और इससे पहले कि मैं इसे एक ओरेकल तालिका में निर्यात करूं, डेटाफ़्रेम में डाल दूं। ... यह मैं जानता हूँ कि गहराई में सुंदर है, लेकिन अभी जो कदम मुझे पकड़ रहा है वह डेटा को डेटाफ़्रेम में डाल रहा है .... किसी कारण से मेरे शब्दकोश में एक कुंजी है और सभी डेटा मूल्यों में है, इसलिए यह मुश्किल है बड़े करीने से पंक्तियों और स्तंभों में डालने की कोशिश कर रहा है ..
theprowler

118

आप इसके लिए jsonमॉड्यूल का उपयोग कर सकते हैं । dumpsइस मॉड्यूल में समारोह साथ सही प्रारूप में स्ट्रिंग है जिसे आप मुद्रित कर सकते हैं में एक JSON ऑब्जेक्ट बदल देता है।

import json

cars = {'A':{'speed':70, 'color':2},
        'B':{'speed':60, 'color':3}}

print(json.dumps(cars, indent = 4))

आउटपुट जैसा दिखता है

{
    "ए": {
        "रंग": 2,
        "गति": 70
    },
    "बी": {
        "रंग": 3,
        "गति": 60
    }
}

प्रलेखन भी इस विधि के लिए उपयोगी विकल्पों में से एक गुच्छा निर्दिष्ट करता है।


2
यह सच है कि तानाशाह की सामग्री को जसन में क्रमबद्ध होना चाहिए, हालांकि, यहां प्रदान किया गया उत्पादन pprint.PrettyPrinter द्वारा उत्पादित आउटपुट की तुलना में कहीं अधिक क्लीनर (जैसे, मानव पठनीय) है। विशेष रूप से लगातार इंडेंटेशन के क्षेत्र में और स्ट्रिंग उपसर्गों को त्यागना जैसे कि u'foo '।
भैंस

मैं करता हूं print(json.dumps(cars, indent=4, ensure_ascii=False))क्योंकि अन्यथा गैर-एएससीआईआई अक्षर अपठनीय हैं।
बोरिस

85

एक अधिक सामान्यीकृत समाधान जो मनमाने ढंग से गहरे घोंसले के शिकार और सूचियों को संभालता है:

def dumpclean(obj):
    if isinstance(obj, dict):
        for k, v in obj.items():
            if hasattr(v, '__iter__'):
                print k
                dumpclean(v)
            else:
                print '%s : %s' % (k, v)
    elif isinstance(obj, list):
        for v in obj:
            if hasattr(v, '__iter__'):
                dumpclean(v)
            else:
                print v
    else:
        print obj

यह उत्पादन का उत्पादन करता है:

A
color : 2
speed : 70
B
color : 3
speed : 60

मैं इसी तरह की जरूरत के लिए भागा और अपने लिए एक अभ्यास के रूप में अधिक मजबूत कार्य विकसित किया। मैं इसे यहाँ शामिल कर रहा हूँ अगर यह दूसरे के लिए मूल्य का हो सकता है। Nosetest चलाने में, मैंने कॉल में आउटपुट स्ट्रीम को निर्दिष्ट करने में सक्षम होना भी उपयोगी पाया, ताकि sys.stderr का उपयोग किया जा सके।

import sys

def dump(obj, nested_level=0, output=sys.stdout):
    spacing = '   '
    if isinstance(obj, dict):
        print >> output, '%s{' % ((nested_level) * spacing)
        for k, v in obj.items():
            if hasattr(v, '__iter__'):
                print >> output, '%s%s:' % ((nested_level + 1) * spacing, k)
                dump(v, nested_level + 1, output)
            else:
                print >> output, '%s%s: %s' % ((nested_level + 1) * spacing, k, v)
        print >> output, '%s}' % (nested_level * spacing)
    elif isinstance(obj, list):
        print >> output, '%s[' % ((nested_level) * spacing)
        for v in obj:
            if hasattr(v, '__iter__'):
                dump(v, nested_level + 1, output)
            else:
                print >> output, '%s%s' % ((nested_level + 1) * spacing, v)
        print >> output, '%s]' % ((nested_level) * spacing)
    else:
        print >> output, '%s%s' % (nested_level * spacing, obj)

इस फ़ंक्शन का उपयोग करते हुए, ओपी का आउटपुट इस तरह दिखता है:

{
   A:
   {
      color: 2
      speed: 70
   }
   B:
   {
      color: 3
      speed: 60
   }
}

जो मुझे व्यक्तिगत रूप से अधिक उपयोगी और वर्णनात्मक लगा।

थोड़ा कम तुच्छ उदाहरण दिया:

{"test": [{1:3}], "test2":[(1,2),(3,4)],"test3": {(1,2):['abc', 'def', 'ghi'],(4,5):'def'}}

ओपी का अनुरोधित समाधान यह पैदावार देता है:

test
1 : 3
test3
(1, 2)
abc
def
ghi
(4, 5) : def
test2
(1, 2)
(3, 4)

जबकि 'वर्धित' संस्करण इससे उपज देता है:

{
   test:
   [
      {
         1: 3
      }
   ]
   test3:
   {
      (1, 2):
      [
         abc
         def
         ghi
      ]
      (4, 5): def
   }
   test2:
   [
      (1, 2)
      (3, 4)
   ]
}

मुझे उम्मीद है कि यह इस प्रकार की कार्यक्षमता की तलाश में अगले व्यक्ति को कुछ मूल्य प्रदान करता है।


11
और यदि प्रारूप अत्यधिक सख्त नहीं है, तो कोई 'प्रिंट json.dumps (obj, indent = 3)' का भी उपयोग कर सकता है। यह अधिकांश संरचनाओं का एक उचित प्रतिनिधित्व देता है, हालांकि यह एक कुंजी के रूप में एक टपल के उपयोग के कारण मेरे कम-तुच्छ उदाहरण पर चोक (मेरे वातावरण में) करता है ...
MrWonderful

7
क्यों नहीं बस pprint.pprint()यहाँ का उपयोग करें?
मार्टिज़न पीटरर्स

1
लगभग एक JSON निर्माता बनाया, नहीं?
user2007447

30

आपके पास एक नेस्टेड संरचना है, इसलिए आपको नेस्टेड शब्दकोश को भी प्रारूपित करने की आवश्यकता है:

for key, car in cars.items():
    print(key)
    for attribute, value in car.items():
        print('{} : {}'.format(attribute, value))

यह प्रिंट:

A
color : 2
speed : 70
B
color : 3
speed : 60

28

pprint.pprint() इस काम के लिए एक अच्छा उपकरण है:

>>> import pprint
>>> cars = {'A':{'speed':70,
...         'color':2},
...         'B':{'speed':60,
...         'color':3}}
>>> pprint.pprint(cars, width=1)
{'A': {'color': 2,
       'speed': 70},
 'B': {'color': 3,
       'speed': 60}}



4

निम्नलिखित एक-लाइनर की जाँच करें:

print('\n'.join("%s\n%s" % (key1,('\n'.join("%s : %r" % (key2,val2) for (key2,val2) in val1.items()))) for (key1,val1) in cars.items()))

आउटपुट:

A
speed : 70
color : 2
B
speed : 60
color : 3

एक अच्छा, लेकिन मैंने इसे इस के साथ उपयोग करने के लिए बदलने की कोशिश की sys.modules, लेकिन मैं असफल रहा। इस पर जाना चाहते हैं?
२:३२

4

मैं स्वच्छ स्वरूपण पसंद करता हूं yaml:

import yaml
yaml.dump(cars)

उत्पादन:

A:
  color: 2
  speed: 70
B:
  color: 3
  speed: 60

आपको pip install PyYAMLपहले करना होगा।
बोरिस

0
###newbie exact answer desired (Python v3):
###=================================
"""
cars = {'A':{'speed':70,
        'color':2},
        'B':{'speed':60,
        'color':3}}
"""

for keys, values in  reversed(sorted(cars.items())):
    print(keys)
    for keys,values in sorted(values.items()):
        print(keys," : ", values)

"""
Output:
B
color  :  3
speed  :  60
A
color  :  2
speed  :  70

##[Finished in 0.073s]
"""

0
# Declare and Initialize Map
map = {}

map ["New"] = 1
map ["to"] = 1
map ["Python"] = 5
map ["or"] = 2

# Print Statement
for i in map:
  print ("", i, ":", map[i])

#  New : 1
#  to : 1
#  Python : 5
#  or : 2

0

यहाँ मेरी समस्या का समाधान है। मुझे लगता है कि यह दृष्टिकोण में समान है, लेकिन कुछ अन्य उत्तरों की तुलना में थोड़ा सरल है। यह उप-शब्दकोशों की एक मनमानी संख्या के लिए भी अनुमति देता है और किसी भी डेटाटाइप के लिए काम करने लगता है (मैंने इसे एक शब्दकोश पर भी परखा जो मूल्यों के रूप में कार्य करता है):

def pprint(web, level):
    for k,v in web.items():
        if isinstance(v, dict):
            print('\t'*level, f'{k}: ')
            level += 1
            pprint(v, level)
            level -= 1
        else:
            print('\t'*level, k, ": ", v)

-1

MrWonderful कोड को संशोधित करना

import sys

def print_dictionary(obj, ident):
    if type(obj) == dict:
        for k, v in obj.items():
            sys.stdout.write(ident)
            if hasattr(v, '__iter__'):
                print k
                print_dictionary(v, ident + '  ')
            else:
                print '%s : %s' % (k, v)
    elif type(obj) == list:
        for v in obj:
            sys.stdout.write(ident)
            if hasattr(v, '__iter__'):
                print_dictionary(v, ident + '  ')
            else:
                print v
    else:
        print obj

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