Làm cách nào để in một dòng từ điển theo từng dòng trong Python?


166

Đây là từ điển

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

Sử dụng cái này for loop

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

Nó in như sau:

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

Nhưng tôi muốn chương trình in nó như thế này:

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

Tôi mới bắt đầu học từ điển nên tôi không biết phải làm thế nào.

Câu trả lời:


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

đầu ra:

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

12
Tôi biết điều này đã cũ, nhưng tôi nghĩ rằng sẽ đáng để đề cập rằng điều này không hoạt động nếu ô tô [x] là số nguyên. Đó không phải là những gì OP yêu cầu, vì vậy tôi chỉ nói điều đó với bất kỳ ai tình cờ cho rằng đây là một giải pháp chăn.
Darrel Holt

@DarrelHolt bạn có biết làm thế nào để nó hoạt động với số nguyên không? Bởi vì đó là vấn đề tôi hiện đang phải đối mặt
theprowler

@theprowler Cách gần nhất tôi có thể tạo lại vấn đề là nếu cars = {1:4, 2:5}sau đó cars[x]là một số nguyên được ánh xạ tới khóa xchứ không phải là một tập hợp được ánh xạ tới khóa x. Trong trường hợp này, bạn không cần sử dụng for y in cars[x]:dòng vì chỉ có một giá trị bạn đang truy xuất, trừ khi bạn đang sử dụng một cái gì đó như danh sách hoặc bộ số nguyên thì nó sẽ hoạt động. Xin lỗi, đã được một vài tháng vì vậy tôi hoàn toàn không thể nhớ mình đã đi đến kết luận bình luận trước đó như thế nào. Bạn có thể gửi cho tôi mã của bạn và tôi có thể xem tôi có giúp được gì không.
Darrel Holt

Hừm. Tôi nghĩ vấn đề của tôi thậm chí còn tồi tệ hơn thế. Về cơ bản tôi đã phân tích một số dữ liệu từ một bảng HTML và tôi tình cờ lưu trữ nó trong một từ điển, và bây giờ tôi đang cố lấy dữ liệu từ điển đó và đưa nó vào DataFrame trước khi tôi xuất tất cả vào bảng Oracle. ... tôi biết khá sâu sắc, nhưng bước đang giữ tôi ngay bây giờ là đưa dữ liệu vào DataFrame .... từ điển của tôi vì một lý do nào đó có một khóa và tất cả dữ liệu đều nằm trong các giá trị, vì vậy rất khó cố gắng đặt nó gọn gàng vào các hàng và cột ..
theprowler

118

Bạn có thể sử dụng jsonmô-đun cho việc này. Các dumpschức năng trong mô-đun này chuyển đổi một đối tượng JSON thành một chuỗi định dạng đúng mà sau đó bạn có thể in.

import json

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

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

Đầu ra trông như

{
    "A": {
        "màu": 2,
        "tốc độ": 70
    },
    "B": {
        "màu": 3,
        "tốc độ": 60
    }
}

Các tài liệu cũng chỉ rõ một loạt các tùy chọn hữu ích cho phương pháp này.


2
đúng, nội dung của dict phải được tuần tự hóa thành json, tuy nhiên, đầu ra được cung cấp ở đây sạch hơn nhiều (ví dụ, con người có thể đọc được) so với đầu ra được tạo bởi pprint.PrettyPrinter. cụ thể trong lĩnh vực thụt đầu dòng nhất quán và loại bỏ các tiền tố chuỗi như u'foo '.
Buffalo Rabor

Tôi làm print(json.dumps(cars, indent=4, ensure_ascii=False))bởi vì nếu không các ký tự không phải ASCII là không thể đọc được.
Boris

85

Một giải pháp tổng quát hơn xử lý các danh sách và danh sách lồng nhau sâu tùy ý sẽ là:

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

Điều này tạo ra đầu ra:

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

Tôi gặp phải một nhu cầu tương tự và phát triển một chức năng mạnh mẽ hơn như là một bài tập cho chính mình. Tôi bao gồm nó ở đây trong trường hợp nó có thể có giá trị cho người khác. Khi chạy nosetest, tôi cũng thấy hữu ích khi có thể chỉ định luồng đầu ra trong cuộc gọi để sys.stderr có thể được sử dụng thay thế.

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)

Sử dụng chức năng này, đầu ra của OP trông như thế này:

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

mà cá nhân tôi thấy là hữu ích và mô tả hơn.

Cho ví dụ ít tầm thường hơn về:

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

Giải pháp yêu cầu của OP mang lại điều này:

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

trong khi phiên bản 'nâng cao' mang lại điều này:

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

Tôi hy vọng điều này cung cấp một số giá trị cho người tiếp theo tìm kiếm loại chức năng này.


11
Và nếu định dạng không quá nghiêm ngặt, người ta cũng có thể sử dụng 'print json.dumps (obj, indent = 3)'. Điều đó mang lại một đại diện hợp lý cho hầu hết các cấu trúc, mặc dù nó bị sặc (trong môi trường của tôi) trong ví dụ ít tầm thường hơn của tôi do sử dụng một tuple làm chìa khóa ...
MrWonderful

7
Tại sao không chỉ sử dụng pprint.pprint()ở đây?
Martijn Pieters

1
gần như đã tạo một trình tạo JSON, phải không?
dùng2007447

30

Bạn có một cấu trúc lồng nhau, vì vậy bạn cũng cần định dạng từ điển lồng nhau:

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

Bản in này:

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

28

pprint.pprint() là một công cụ tốt cho công việc này:

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

Điều này sẽ hoạt động nếu bạn biết cây chỉ có hai cấp độ:

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

4

Kiểm tra một trong những lót sau:

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

Đầu ra:

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

Đẹp một, nhưng tôi đã cố gắng chuyển đổi nó để sử dụng với sys.modules, nhưng tôi đã thất bại. Bạn muốn đi đến đó không?
not2qubit

4

Tôi thích định dạng rõ ràng của yaml:

import yaml
yaml.dump(cars)

đầu ra:

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

Bạn phải pip install PyYAMLđầu tiên.
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

Đây là giải pháp của tôi cho vấn đề. Tôi nghĩ rằng cách tiếp cận tương tự, nhưng đơn giản hơn một số câu trả lời khác. Nó cũng cho phép một số từ điển phụ tùy ý và dường như hoạt động cho bất kỳ kiểu dữ liệu nào (tôi thậm chí đã thử nó trên một từ điển có chức năng như các giá trị):

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

Sửa đổi mã 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
Bạn đã sửa đổi những gì? Đầu ra là gì?
Andreas Haferburg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.