Python'da bir sözlük satır satır nasıl yazdırılır?


166

Bu sözlük

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

Bunu kullanarak for loop

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

Aşağıdakileri yazdırır:

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

Ama programın böyle yazdırmasını istiyorum:

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

Sözlükleri öğrenmeye yeni başladım, bu yüzden bunu nasıl yapacağımdan emin değilim.

Yanıtlar:


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

çıktı:

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

12
Bunun eski olduğunu biliyorum, ancak arabalar [x] tamsayılarsa bunun işe yaramayacağından bahsetmeye değer olacağını düşündüm. OP'nin talep ettiği şey bu değildi, bu yüzden bunu battaniye bir çözüm olduğu varsayılarak tökezleyen herkes için söylüyorum.
Darrel Holt

@DarrelHolt tamsayılarla nasıl çalışacağını biliyor musunuz? Çünkü şu anda karşı karşıya olduğum sorun
theprowler

@theprowler Sorunu yeniden oluşturmak için alabileceğim en yakın şey, o cars = {1:4, 2:5}zaman cars[x]anahtarla xeşlenen bir küme yerine anahtarla eşlenmiş bir tamsayıdır x. Bu durumda, for y in cars[x]:satırı kullanmanız gerekmez, çünkü bir liste veya tamsayı kümesi gibi bir şey kullanmıyorsanız, almanız gereken tek bir değer vardır. Üzgünüm, birkaç ay oldu, bu yüzden önceki yorumumun sonucuna nasıl geldiğimi tamamen hatırlayamıyorum. Bana kodunuzu gönderebilirsiniz ve herhangi bir yardım olup olmadığımı görebiliyorum.
Darrel Holt

Hmm. Sanırım sorunum bundan daha kötü. Temelde bir HTML tablosundan bazı verileri ayrıştırdım ve bir sözlükte sakladım ve şimdi o sözlük verilerini almaya ve hepsini bir Oracle tablosuna aktarmadan önce bir DataFrame'e koymaya çalışıyorum. ... derinlemesine biliyorum, ama şu anda beni tutan adım veriyi bir DataFrame'e koymak ... bir sebepten dolayı sözlüğüm bir anahtar var ve tüm veriler değerlerde, bu yüzden zor düzgün bir şekilde satırlara ve sütunlara koymaya çalışıyor ..
theprowler

118

Bunun için jsonmodülü kullanabilirsiniz . dumpsBu modülde işlevi daha sonra yazdırabilirsiniz düzgün şekilde biçimlendirilmiş bir dize içine bir JSON nesnesi dönüştürür.

import json

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

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

Çıktı şöyle görünüyor

{
    "A": {
        "renk": 2,
        "hız": 70
    },
    "B": {
        "renk": 3,
        "hız": 60
    }
}

Dokümantasyon da bu yöntem için kullanışlı seçenekler bir demet belirtir.


2
doğruysa, söz konusu içeriğin json'a serileştirilmesi gerekir, ancak burada sağlanan çıktı, pprint tarafından üretilen çıktıdan çok daha temizdir (örneğin, insan tarafından okunabilir). özellikle u'foo gibi dize öneklerinin tutarlı girintisi ve atılması alanında.
Buffalo Rabor

Yapmam print(json.dumps(cars, indent=4, ensure_ascii=False))aksi ASCII olmayan karakterler okunamaz çünkü.
Boris

85

Keyfi derinden yuvalanmış dikte ve listeleri işleyen daha genelleştirilmiş bir çözüm:

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

Bu çıktıyı üretir:

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

Benzer bir ihtiyaçla karşılaştım ve kendim için bir egzersiz olarak daha sağlam bir fonksiyon geliştirdim. Başka bir değeri olabilir diye buraya dahil ediyorum. Nosetest'i çalıştırırken, çağrıdaki çıkış akışını belirtmenin yararlı olduğunu gördüm, böylece sys.stderr kullanılabilir.

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)

Bu işlevi kullanarak, OP'nin çıkışı şöyle görünür:

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

kişisel olarak daha yararlı ve açıklayıcı buldum.

Biraz daha az önemsiz örneği göz önüne alındığında:

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

OP'nin talep ettiği çözüm bunu sağlar:

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

oysa 'gelişmiş' versiyon bunu verir:

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

Umarım bu işlevsellik arayan bir sonraki kişiye biraz değer katar.


11
Ve biçim aşırı katı değilse, 'print json.dumps (obj, indent = 3)' de kullanılabilir. Bir anahtarın bir anahtar olarak kullanılması nedeniyle daha az önemsiz
örneğimde

7
Neden sadece pprint.pprint()burada kullanmıyorsunuz ?
Martijn Pieters

1
neredeyse bir JSON yaratıcısı yaptı, değil mi?
user2007447

30

Yuvalanmış bir yapınız var, bu nedenle yuvalanmış sözlüğü de biçimlendirmeniz gerekiyor:

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

Bu yazdırır:

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

28

pprint.pprint() bu iş için iyi bir araçtır:

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

Ağacın sadece iki seviyesi olduğunu biliyorsanız bu işe yarar:

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

4

Aşağıdaki tek astarı kontrol edin:

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

Çıktı:

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

Güzel, ama bunu kullanmak için dönüştürmek için çalıştı sys.modules, ama başarısız oldu. Bir göz atmak ister misin?
not2qubit

4

Temiz biçimlendirmeyi tercih ederim yaml:

import yaml
yaml.dump(cars)

çıktı:

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

Önce yapmalısın pip install PyYAML.
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

İşte benim sorunun çözümü. Yaklaşımda benzer olduğunu düşünüyorum, ancak diğer cevaplardan biraz daha basit. Ayrıca rasgele sayıda alt sözlük için izin verir ve herhangi bir veri türü için çalışıyor gibi görünüyor (hatta değer olarak fonksiyonları olan bir sözlükte test ettim):

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 kodunu değiştirme

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
Neyi değiştirdiniz? Çıktı nedir?
Andreas Haferburg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.