পাইথনে লাইনে ডিকশনারি কীভাবে প্রিন্ট করা যায়?


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
আমি জানি এটি পুরানো, তবে আমি ভেবেছিলাম এটি উল্লেখযোগ্য হবে যে গাড়ি [এক্স] পূর্ণসংখ্যা হলে এটি কাজ করে না। এটি ওপি যা অনুরোধ করেছিল তা নয়, সুতরাং আমি একে একে বলছি এটির একটি কম্বল সমাধান বলে ধরে নিয়ে এই যে হোঁচট খায় তার জন্য।
ড্যারেল হল্ট

@ ড্যারেলহোল্ট আপনি কীভাবে এটি পূর্ণসংখ্যার সাথে কাজ করতে জানেন? কারণ বর্তমানে এই সমস্যাটিই আমি
सामना

@theprowler নিকটতম আমি সমস্যা recreating পেতে পারেন যদি cars = {1:4, 2:5}তারপর cars[x]একটি পূর্ণসংখ্যা কী ম্যাপ করা হয় xএকটি সেট চাবি ম্যাপ বদলে x। এই ক্ষেত্রে, আপনাকে for y in cars[x]:লাইনটি ব্যবহার করার দরকার নেই কারণ আপনি পুনরুদ্ধার করছেন এমন একমাত্র মান রয়েছে, যদি না আপনি তালিকা বা পূর্ণসংখ্যার সেট এর মতো কিছু ব্যবহার করেন তবে এটি কাজ করা উচিত। দুঃখিত, কয়েক মাস কেটে গেছে তাই আমি কীভাবে আমার আগের মন্তব্যে সিদ্ধান্তে এসেছি তা পুরোপুরি মনে করতে পারি না। আপনি আমাকে আপনার কোডটি প্রেরণ করতে পারেন এবং আমি কোনও সহায়তা করছি কিনা তা দেখতে পাচ্ছি।
ড্যারেল হোল্ট

হুম। আমি মনে করি আমার সমস্যাটি এর চেয়েও খারাপ। মূলত আমি এইচটিএমএল টেবিল থেকে কিছু তথ্য বিশ্লেষণ করেছি, এবং আমি এটি একটি অভিধানে সংরক্ষণ করার চেষ্টা করেছি এবং এখন আমি এই অভিধানটি ডেটা নেওয়ার চেষ্টা করছি এবং এটি সমস্ত ওরাকল টেবিলে রফতানির আগে এটি একটি ডেটা ফ্রেমে রাখি। ... এটি আমি গভীরভাবে জানি, তবে এখনই যে পদক্ষেপটি আমাকে ধরে রেখেছে তা ডেটাফ্রেমে ডেটা রাখছে .... কোনও কারণে আমার অভিধানে একটি কী রয়েছে এবং সমস্ত ডেটা মানগুলিতে রয়েছে, তাই এটি কঠিন এটিকে সারি এবং কলামগুলিতে
ঝরঝরে করে রাখার

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
সত্য, ডিকের বিষয়বস্তু অবশ্যই জসন-এ সিরিয়ালিয়যোগ্য হতে হবে, তবে, এখানে প্রদত্ত আউটপুট পিআরআইপি.প্রিটিপ্রিন্টার দ্বারা উত্পাদিত আউটপুটের তুলনায় অনেক বেশি ক্লিনার (যেমন, মানব পাঠযোগ্য) is বিশেষত ধারাবাহিক ইন্ডেন্টেশন এবং u'foo 'এর মতো স্ট্রিং উপসর্গগুলি ছড়িয়ে দেওয়ার ক্ষেত্রে।
মহিষ রেবোর

আমি না print(json.dumps(cars, indent=4, ensure_ascii=False))কারণ অন্যথায় ASCII অক্ষরগুলি অপঠনযোগ্য।
বরিস

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

আমি অনুরূপ প্রয়োজনে চলে এসেছি এবং নিজের অনুশীলন হিসাবে আরও শক্তিশালী ফাংশন বিকাশ করেছি। এটি অন্যের পক্ষে যখন মূল্যবান হতে পারে তবে আমি এখানে এটি অন্তর্ভুক্ত করছি। নাস্তেস্টে চলতে চলতে, আমি কলটিতে আউটপুট স্ট্রিমটি নির্দিষ্ট করতে সক্ষম হওয়াও সহায়ক বলে মনে করি যাতে এর পরিবর্তে 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
এবং যদি ফর্ম্যাটটি অত্যধিক কঠোর না হয়, তবে কেউ 'jset.dumps মুদ্রণ (অবজেক্ট, ইনডেন্ট = 3)' ব্যবহার করতে পারে। এটি বেশিরভাগ কাঠামোর একটি যুক্তিসঙ্গত উপস্থাপনা দেয়, যদিও এটি
টিপলটিকে

7
শুধু pprint.pprint()এখানে কেন ব্যবহার করবেন না ?
মার্টিজন পিটারস

1
প্রায় একটি JSON স্রষ্টা তৈরি, না?
ব্যবহারকারী 20047447

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

আপনি যদি জানেন গাছের কেবল দুটি মাত্রা থাকে তবে এটি কাজ করবে:

for k1 in cars:
    print(k1)
    d = cars[k1]
    for k2 in d
        print(k2, ':', d[k2])

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, কিন্তু আমি ব্যর্থ হয়েছি। যেতে চান?
not2qubit

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

মিঃ ওয়ান্ডারফুল কোডটি সংশোধন করা হচ্ছে

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
আপনি কী পরিবর্তন করেছেন? আউটপুট কি?
Andreas হাফারবার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.