2013-04-03 5 views
83

Это словарьКак печатать словарь по строкам в Python?

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 

Я только начал изучать словари, поэтому не знаю, как это сделать.

ответ

82
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 
+8

Я знаю, что это старый, но я подумал, что стоит отметить, что это не работает, если автомобили [х] целые числа. Это не то, что запросил ОП, поэтому я просто говорю это для всех, кто натыкается на это, полагая, что это решение на одеяле. –

+0

@ DarrelHolt Вы знаете, как заставить его работать с целыми числами? Потому что это проблема, с которой я столкнулся сейчас – theprowler

+0

@theprowler. Ближе всего я могу подобраться к проблеме, если 'cars = {1: 4, 2: 5}' then 'cars [x]' - целое число, отображаемое на ключ 'x', а не набор, сопоставленный с ключом' x'. В этом случае вам не нужно использовать строку 'for y in cars [x]:', потому что есть только одно значение, которое вы извлекаете, если вы не используете что-то вроде списка или набора целых чисел, тогда оно должно работать , Простите, прошло несколько месяцев, поэтому я не могу полностью вспомнить, как я пришел к выводу о моем предыдущем комментарии. Вы можете отправить мне свой код, и я могу понять, не помогаю ли мне. –

23

Вы имеете вложенную структуру, так что вам нужно форматировать вложенный словарь тоже:

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 
4
for car,info in cars.items(): 
    print(car) 
    for key,value in info.items(): 
     print(key, ":", value) 
3

Это будет работать, если вы знаете, что дерево имеет только два уровня:

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

Более обобщенное решение, которое обрабатывает произвольно глубоко вложенные dicts и списки будут:

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 

Это производит выход :

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

Я столкнулся с подобной потребностью и разработал более прочную функцию как упражнение для себя. Я включаю его здесь, если он может быть полезен другому. При запуске nosetest я также счел полезным указать выходной поток в вызове, чтобы вместо этого использовать 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) 

Используя эту функцию, выход операционного усилителя выглядит следующим образом:

{ 
    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) 
    ] 
} 

Надеюсь, это придает определенную ценность следующему человеку, который ищет этот тип функциональности.

+8

И если формат не слишком строгий, можно также использовать 'print json.dumps (obj, indent = 3)'. Это дает разумное представление большинства структур, хотя оно делает затвор (в моей среде) на моем менее тривиальном примере из-за использования кортежа в качестве ключа ... – MrWonderful

+4

Почему бы просто не использовать ['pprint.pprint()' ] (https://docs.python.org/2/library/pprint.html#pprint.pprint) здесь? –

+0

почти сделал создателя JSON, нет? – user2007447

2

Проверьте следующее Однострочник:

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 
11

Как Мартейн Питерс упоминается в одном из комментариев выше PrettyPrint является хорошим инструментом для этой работы:

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

Для этого вы можете использовать модуль json. Функция dumps в этом модуле преобразует объект JSON в правильно отформатированную строку, которую вы можете распечатать.

import json 

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

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

Результат выглядит

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

documentation также определяет кучу полезных опций для этого метода.

+0

он не работает для значений 'datetime' – fjardon

0

Изменение 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 
Смежные вопросы