Bagaimana cara mencetak baris demi baris kamus dengan Python?


166

Ini kamusnya

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

Menggunakan ini for loop

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

Mencetak berikut ini:

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

Tapi saya ingin program mencetaknya seperti ini:

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

Saya baru saja mulai belajar kamus, jadi saya tidak yakin bagaimana melakukannya.

Jawaban:


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

keluaran:

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

12
Saya tahu ini sudah tua, tetapi saya pikir akan layak untuk disebutkan bahwa ini tidak berfungsi jika mobil [x] bilangan bulat. Bukan itu yang diminta OP, jadi saya hanya mengatakannya untuk siapa saja yang menemukan ini dengan asumsi itu solusi selimut.
Darrel Holt

@ DarrelHolt Anda tahu cara membuatnya bekerja dengan bilangan bulat? Karena itulah masalah yang saya hadapi saat ini
theprowler

@theprowler Yang paling dekat saya bisa menciptakan masalah adalah jika cars = {1:4, 2:5}kemudian cars[x]adalah bilangan bulat yang dipetakan ke kunci xdaripada satu set dipetakan ke kunci x. Dalam hal ini, Anda tidak perlu menggunakan for y in cars[x]:baris karena hanya ada satu nilai yang Anda ambil, kecuali jika Anda menggunakan sesuatu seperti daftar atau kumpulan bilangan bulat maka itu harus bekerja. Maaf, sudah beberapa bulan jadi saya tidak bisa sepenuhnya mengingat bagaimana saya sampai pada kesimpulan dari komentar saya sebelumnya. Anda dapat mengirim saya kode Anda dan saya dapat melihat apakah saya dapat membantu.
Darrel Holt

Hmm. Saya pikir masalah saya bahkan lebih buruk dari itu. Pada dasarnya saya telah mengurai beberapa data dari tabel HTML, dan kebetulan saya menyimpannya di kamus, dan sekarang saya mencoba untuk mengambil data kamus dan memasukkannya ke dalam DataFrame sebelum saya mengekspor semuanya ke tabel Oracle. ... itu cukup mendalam, saya tahu, tetapi langkah yang menahan saya sekarang adalah memasukkan data ke dalam DataFrame .... kamus saya karena suatu alasan memiliki satu kunci dan semua data dalam nilai, jadi sulit mencoba memasukkannya dengan rapi ke dalam baris dan kolom ..
theprowler

118

Anda dapat menggunakan jsonmodul untuk ini. The dumpsfungsi dalam modul ini mengkonversi objek JSON menjadi string diformat dengan benar yang kemudian dapat mencetak.

import json

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

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

Outputnya seperti

{
    "SEBUAH": {
        "warna": 2,
        "speed": 70
    },
    "B": {
        "warna": 3,
        "speed": 60
    }
}

The dokumentasi juga menentukan sekelompok pilihan berguna untuk metode ini.


2
benar, isi dikt harus serial ke json, namun, output yang disediakan di sini jauh lebih bersih (misalnya, dapat dibaca manusia) daripada output yang dihasilkan oleh pprint.PrettyPrinter. khusus di bidang indentasi yang konsisten dan membuang awalan string seperti u'foo '.
Buffalo Rabor

Saya lakukan print(json.dumps(cars, indent=4, ensure_ascii=False))karena karakter non-ASCII tidak dapat dibaca.
Boris

85

Solusi yang lebih digeneralisasi yang menangani dicts dan daftar yang bersarang secara semarak adalah:

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

Ini menghasilkan output:

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

Saya bertemu dengan kebutuhan yang sama dan mengembangkan fungsi yang lebih kuat sebagai latihan untuk diri saya sendiri. Saya menyertakannya di sini untuk berjaga-jaga. Dalam menjalankan nosetest, saya juga merasa terbantu untuk dapat menentukan aliran output dalam panggilan sehingga sys.stderr dapat digunakan sebagai gantinya.

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)

Menggunakan fungsi ini, output OP terlihat seperti ini:

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

yang menurut saya pribadi lebih bermanfaat dan deskriptif.

Diberikan contoh yang sedikit kurang sepele dari:

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

Solusi yang diminta OP menghasilkan ini:

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

sedangkan versi 'disempurnakan' menghasilkan ini:

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

Saya harap ini memberikan beberapa nilai kepada orang berikutnya yang mencari jenis fungsi ini.


11
Dan jika formatnya tidak terlalu ketat, kita juga bisa menggunakan 'print json.dumps (obj, indent = 3)'. Itu memberikan representasi yang masuk akal dari sebagian besar struktur, meskipun itu tersedak (dalam lingkungan saya) pada contoh saya yang kurang sepele karena penggunaan tuple sebagai kunci ...
MrWonderful

7
Mengapa tidak gunakan saja di pprint.pprint()sini saja?
Martijn Pieters

1
hampir membuat pencipta JSON, bukan?
user2007447

30

Anda memiliki struktur bersarang, jadi Anda perlu memformat kamus bersarang juga:

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

Ini mencetak:

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

28

pprint.pprint() adalah alat yang baik untuk pekerjaan ini:

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

6
for car,info in cars.items():
    print(car)
    for key,value in info.items():
        print(key, ":", value)

4

Ini akan berhasil jika Anda tahu pohon itu hanya memiliki dua tingkat:

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

4

Periksa satu-liner berikut:

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()))

Keluaran:

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

Bagus, tapi saya mencoba mengubahnya untuk menggunakan ini sys.modules, tapi saya gagal. Ingin mencobanya?
not2qubit

4

Saya lebih suka pemformatan bersih yaml:

import yaml
yaml.dump(cars)

keluaran:

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

Anda harus pip install PyYAMLterlebih dahulu.
Boris

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

Ini solusi saya untuk masalah ini. Saya pikir itu mirip dalam pendekatan, tetapi sedikit lebih sederhana daripada beberapa jawaban lainnya. Hal ini juga memungkinkan untuk sejumlah sub-kamus yang sewenang-wenang dan tampaknya berfungsi untuk tipe data apa pun (saya bahkan mengujinya pada kamus yang memiliki fungsi sebagai nilai):

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

Memodifikasi kode MrWerlang

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
Apa yang kamu modifikasi? Apa hasilnya?
Andreas Haferburg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.