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.

Jett
sumber

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
namit
sumber
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.

kchak
sumber
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.

MrWificent
sumber
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
Martijn Pieters
sumber
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}}
mac13k
sumber
6
for car,info in cars.items():
    print(car)
    for key,value in info.items():
        print(key, ":", value)
Scott Olson
sumber
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])
Benjamin Hodgson
sumber
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
kenorb
sumber
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
gizzmole
sumber
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]
"""
bpr67
sumber
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
TheManHimself
sumber
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)
batu gelombang
sumber
-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
Vlad
sumber
1
Apa yang kamu modifikasi? Apa hasilnya?
Andreas Haferburg