2013-04-03 15 views
83

Jest to słownikJak wydrukować wiersz słownika po linii w Pythonie?

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

Stosując tę ​​for loop

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

Drukuje następujące:

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

Ale chcę program do drukowania to tak:

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

Po prostu zacząłem uczyć się słowników, więc nie jestem pewien, jak to zrobić.

Odpowiedz

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

wyjściowa:

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

wiem, że to jest stary, ale pomyślałem, że warto byłoby wspomnieć, że to nie zadziała, jeżeli samochody [x] jest całkowitymi. To nie jest to, o co prosił OP, więc mówię to tylko dla każdego, kto natknie się na to przy założeniu, że jest to rozwiązanie powszechne. –

+0

@DarrelHolt Czy wiesz, jak sprawić, aby działało z liczbami całkowitymi? Ponieważ to jest problem, z którym obecnie borykam się przy patrzeniu: – theprowler

+0

@ theprowler Najbliżej mogę odtworzyć problem, jeśli 'cars = {1: 4, 2: 5}' wtedy 'cars [x]' jest liczbą całkowitą odwzorowaną na klawisz 'x' zamiast zestawu zmapowany na klucz' x'. W tym przypadku nie musisz używać linii 'dla y in cars [x]: ', ponieważ istnieje tylko jedna wartość, którą pobierasz, chyba że używasz czegoś takiego jak lista lub zestaw liczb całkowitych, to powinno działać . Niestety, minęło kilka miesięcy, więc nie pamiętam dokładnie, jak doszedłem do wniosku z poprzedniego komentarza. Możesz wysłać mi swój kod i mogę zobaczyć, czy mogę ci pomóc. –

23

Masz zagnieżdżone struktury, więc trzeba formatować zagnieżdżonego słownika też:

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

Drukuje:

A 
color : 2 
speed : 70 
B 
color : 3 
speed : 60 
4
for car,info in cars.items(): 
    print(car) 
    for key,value in info.items(): 
     print(key, ":", value) 
3

To będzie działać, jeśli wiesz, że drzewo ma tylko dwa poziomy:

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

Bardziej uogólnione rozwiązanie, które obsługuje arbitralnie-głęboko zagnieżdżone dicts i wykazy byłoby:

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

To daje wyjście :

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

Wpadłem na podobną potrzebę i rozwinąłem silniejszą funkcję jako ćwiczenie dla siebie. Załączam go tutaj, na wypadek, gdyby mógł być wartościowy dla drugiego. Podczas testu nosa znalazłem również pomocne, aby móc określić strumień wyjściowy w wywołaniu, aby zamiast tego użyć sys.stderr.

import sys 

def dump(obj, nested_level=0, output=sys.stdout): 
    spacing = ' ' 
    if type(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 type(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) 

Za pomocą tej funkcji wyjście op wygląda tak:

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

które ja osobiście uważam za bardziej użyteczne i opisowe.

względu na nieco mniej trywialne przykład:

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

o ROZWIĄZANIE OP daje to:

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

natomiast Podwyższona wydajnością wersji ta:

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

Mam nadzieję, że zapewnia to wartość następnej osobie poszukującej tego typu funkcji.

+8

A jeśli format nie jest zbyt surowy, można również użyć "print json.dumps (obj, indent = 3)". To daje sensowną reprezentację większości struktur, choć dławi (w moim środowisku) na moim mniej banalnym przykładzie z powodu użycia krotki jako klucza ... – MrWonderful

+4

Dlaczego po prostu użyć ['pprint.pprint()' ] (https://docs.python.org/2/library/pprint.html#pprint.pprint) tutaj? –

+0

prawie stworzyłem twórcę JSON, nie? – user2007447

2

Sprawdź następujące jedno-liner:

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

wyjściowa:

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

Jak Martijn Pieters wspomniano w jednym z komentarzy powyżej prettyprint jest dobrym narzędziem dla tego zadania:

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

Do tego można użyć modułu json. Funkcja dumps w tym module konwertuje obiekt JSON na odpowiednio sformatowany ciąg znaków, który można następnie wydrukować.

import json 

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

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

Wyjście wygląda

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

documentation określa również kilka przydatnych opcji dla tej metody.

+0

nie działa dla wartości 'datetime' – fjardon

0

Modyfikacja kodu 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 
Powiązane problemy