파이썬에서 사전을 한 줄씩 인쇄하는 방법?


166

이것은 사전입니다

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

방금 사전을 배우기 시작했기 때문에 어떻게 해야할지 모르겠습니다.

답변:


142
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

12
나는 이것이 오래되었다는 것을 알고 있지만 cars [x]가 정수이면 이것이 작동하지 않는다는 것을 언급 할 가치가 있다고 생각했습니다. OP가 요청한 것이 아니기 때문에 담요 솔루션이라고 가정하면이 문제를 우연히 해결하는 사람에게만 말하고 있습니다.
Darrel Holt

@DarrelHolt 정수로 작동시키는 방법을 알고 있습니까? 그것이 현재 직면하고있는 문제이기 때문에
theprowler

@theprowler 내가 문제를 다시 얻을 수있는 가장 가까운 경우입니다 cars = {1:4, 2:5}다음 cars[x]키에 매핑 정수 x가 아닌 키에 매핑 세트 x. 이 경우 for y in cars[x]:에는 목록이나 정수 세트와 같은 것을 사용하지 않는 한 검색하는 값이 하나뿐이므로 행 을 사용할 필요가 없습니다 . 죄송합니다. 몇 달이 지났으므로 이전 의견의 결론에 도달 한 방식을 완전히 기억할 수 없습니다. 코드를 보내 주시면 도움이되는지 확인할 수 있습니다.
Darrel Holt

흠. 내 문제는 그것보다 훨씬 나쁘다고 생각합니다. 기본적으로 HTML 테이블에서 일부 데이터를 파싱하고 사전에 저장하려고했는데 이제는 사전 데이터를 가져 와서 Oracle 테이블로 내보내기 전에 DataFrame에 넣습니다. ... 아주 깊이 알고 있지만 지금 당장 잡고있는 단계는 데이터를 DataFrame에 넣는 것입니다 ... 어떤 이유로 든 사전에는 하나의 키가 있으며 모든 데이터는 값에 있으므로 어렵습니다. 행과 열에 깔끔하게 넣으려고 노력했습니다.
theprowler

118

이를 위해 json모듈을 사용할 수 있습니다 . dumps이 모듈 의 함수는 JSON 객체를 올바른 형식의 문자열로 변환 한 다음 인쇄 할 수 있습니다.

import json

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

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

출력은 다음과 같습니다

{
    "ㅏ": {
        "색상": 2,
        "속도": 70
    },
    "B": {
        "색상": 3,
        "속도": 60
    }
}

문서는 또한이 방법에 대한 유용한 옵션의 무리를 지정합니다.


2
사실, dict의 내용은 json으로 직렬화 할 수 있어야하지만 여기에 제공된 출력은 pprint.PrettyPrinter에서 생성 된 출력보다 훨씬 깨끗합니다 (예 : 사람이 읽을 수 있음). 특히 u'foo '와 같은 일관된 들여 쓰기 및 문자열 접두사 삭제 영역에서.
버팔로 Rabor

print(json.dumps(cars, indent=4, ensure_ascii=False))그렇지 않으면 ASCII가 아닌 문자를 읽을 수 없기 때문에 수행 합니다.
보리스

85

임의로 중첩 된 dicts 및 list를 처리하는보다 일반화 된 솔루션은 다음과 같습니다.

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

출력이 생성됩니다.

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

이 기능을 사용하면 OP의 출력은 다음과 같습니다.

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

OP의 요청한 솔루션은 다음과 같습니다.

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

이것이 다음 유형의 기능을 찾는 다음 사람에게 가치를 제공하기를 바랍니다.


11
그리고 형식이 지나치게 엄격하지 않으면 'print json.dumps (obj, indent = 3)'을 사용할 수도 있습니다. 그것은 튜플을 키로 사용하여 사소한 예에서 (내 환경에서) 질식하지만 대부분의 구조를 합리적으로 표현합니다 ...
MrWonderful

7
pprint.pprint()여기서 만 사용하지 않습니까?
Martijn Pieters

1
거의 JSON 제작자를 만들었습니까?
user2007447

30

중첩 구조가 있으므로 중첩 사전도 형식화해야합니다.

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

28

pprint.pprint() 이 작업에 좋은 도구입니다.

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

트리에 두 가지 수준 만 있다는 것을 알고있는 경우 작동합니다.

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

4

다음의 한 줄을 확인하십시오 :

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

좋은 점이지만와 함께 사용하도록 변환하려고 sys.modules했지만 실패했습니다. 그것에 가고 싶어?
not2qubit

4

깨끗한 형식을 선호합니다 yaml:

import yaml
yaml.dump(cars)

산출:

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

pip install PyYAML먼저 해야합니다 .
보리스

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

다음은 문제에 대한 해결책입니다. 나는 그것이 접근 방식과 비슷하지만 다른 답변보다 약간 더 간단하다고 생각합니다. 또한 임의의 수의 하위 사전을 허용하고 모든 데이터 유형에 대해 작동하는 것 같습니다 (값으로 기능이있는 사전에서 테스트했습니다).

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 코드 수정

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
무엇을 수정 했습니까? 출력은 무엇입니까?
Andreas Haferburg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.