简体   繁体   English

以更优雅的方式打印循环字典

[英]Print circular dictionary in more elegant way

I am reading "Data Science from Scratch" by Jeol Grus, which is more than 20 years later since my university course of Data Structure.我正在阅读 Jeol Grus 的“从零开始的数据科学”,这是我在大学学习数据结构课程 20 多年后的事。 Fascinated by the elegant way he writes the code.对他编写代码的优雅方式着迷。 In the example of chapter 1, I am interested in the data structure of appending own dictionary to itself - 'users'.在第 1 章的示例中,我对将自己的字典附加到自身 - 'users' 的数据结构感兴趣。 When I try to understand how it works within the dictionary by printing the contents of 'users', it prints out infinite loops of that dictionary.当我尝试通过打印“用户”的内容来了解它在字典中的工作原理时,它会打印出该字典的无限循环。 And more amazing, no error from Python.更神奇的是,Python 没有错误。 But I still have no idea what the contents are.但我仍然不知道内容是什么。

Searched over some articles, found one on Quora How do I nicely print a nested dictionary in Python?搜索了一些文章,在 Quora 上找到了一篇如何在 Python 中很好地打印嵌套字典? , and understood the contents. ,并了解内容。 Though I start thinking if I can print out the contents in more concise style, like below, with pointers to the dictionary, or similar, instead of repetitive loops.虽然我开始考虑是否可以以更简洁的样式打印出内容,如下所示,使用指向字典的指针或类似的,而不是重复循环。 Possible?可能的?

{"id": 0, "name": "Hero", "friend": [*users[1], *users[2]] }
{"id": 1, "name": "Dunn", "friend": [*users[2], *users[3]] }

Example from Data Science from Scratch从零开始的数据科学示例

users = [
        { "id": 0, "name": "Hero"},
        { "id": 1, "name": "Dunn"},
        { "id": 2, "name": "Sue"},
        { "id": 3, "name": "Chi"},
        { "id": 4, "name": "Thor"},
        { "id": 5, "name": "Clive"},
        { "id": 6, "name": "Hicks"},
        { "id": 7, "name": "Devin"},
        { "id": 8, "name": "Kate"},
        { "id": 9, "name": "Klein"}
]
friendship = [(0,1), (0,2), (1,2), (1,3), (2,3), (3,4),
              (4,5), (5,6), (5,7), (6,8), (7,8), (8,9)]

for user in users :
    user["friends"] = []

for i, j in friendship :
    users[i]["friends"].append(users[j])
    users[j]["friends"].append(users[i])

def number_of_friends(user) :
    """ how many friends does _user_ have """
    return(len(user["friends"]))

total_connection = sum(number_of_friends(user)
                       for user in users)
num_users = len(users)
avg_connection = total_connection / num_users

# create a list (user_id, number_of_friends)
num_friends_by_id = [(user['id'], number_of_friends(user))
                      for user in users]

Print out打印出

{'id': 0, 'name': 'Hero', 'friends': [{'id': 1, 'name': 'Dunn', 'friends': [{...}, {'id': 2, 'name': 'Sue', 'friends': [{...}, {...}, {'id': 3, 'name': 'Chi', 'friends': [{...}, {...}, {'id': 4, 'name': 'Thor', 'friends': [{...}, {'id': 5, 'name': 'Clive', 'friends': [{...}, {'id': 6, 'name': 'Hicks', 'friends': [{...}, {'id': 8, 'name': 'Kate', 'friends': [{...}, {'id': 7, 'name': 'Devin', 'friends': [{...}, {...}]}, {'id': 9, 'name': 'Klein', 'friends': [{...}]}]}]}, {'id': 7, 'name': 'Devin', 'friends': [{...}, {'id': 8, 'name': 'Kate', 'friends': [{'id': 6, 'name': 'Hicks', 'friends': [{...}, {...}]}, {...}, {'id': 9, 'name': 'Klein', 'friends': [{...}]}]}]}]}]}]}]}, {'id': 3, 'name': 'Chi', 'friends': [{...}, {'id': 2, 'name': 'Sue', 'friends': [{...}, {...}, {...}]}, {'id': 4, 'name': 'Thor', 'friends': [{...}, {'id': 5, 'name': 'Clive', 'friends': [{...}, {'id': 6, 'name': 'Hicks', 'friends': [{...}, {'id': 8, 'name': 'Kate', 'friends': [{...}, {'id': 7, 'name': 'Devin', 'friends': [{...}, {...}]}, {'id': 9, 'name': 'Klein', 'friends': [{...}]}]}]}, {'id': 7, 'name': 'Devin', 'friends': [{...}, {'id': 8, 'name': 'Kate', 'friends': [{'id': 6, 'name': 'Hicks', 'friends': [{...}, {...}]}, {...}, {'id': 9, 'name': 'Klein', 'friends': [{...}]}]}]}]}]}]}]}, {'id': 2, 'name': 'Sue', 'friends': [{...}, {'id': 1, 'name': 'Dunn', 'friends': [{...}, {...}, {'id': 3, 'name': 'Chi', 'friends': [{...}, {...}, {'id': 4, 'name': 'Thor', 'friends': [{...}, {'id': 5, 'name': 'Clive', 'friends': [{...}, {'id': 6, 'name': 'Hicks', 'friends': [{...}, {'id': 8, 'name': 'Kate', 'friends': [{...}, {'id': 7, 'name': 'Devin', 'friends': [{...}, {...}]}, {'id': 9, 'name': 'Klein', 'friends': [{...}]}]}]}, {'id': 7, 'name': 'Devin', 'friends': [{...}, {'id': 8, 'name': 'Kate', 'friends': [{'id': 6, 'name': 'Hicks', 'friends': [{...}, {...}]}, {...}, {'id': 9, 'name': 'Klein', 'friends': [{...}]}]}]}]}]}]}]}, {'id': 3, 'name': 'Chi', 'friends': [{'id': 1, 'name': 'Dunn', 'friends': [{...}, {...}, {...}]}, {...}, {'id': 4, 'name': 'Thor', 'friends': [{...}, {'id': 5, 'name': 'Clive', 'friends': [{...}, {'id': 6, 'name': 'Hicks', 'friends': [{...}, {'id': 8, 'name': 'Kate', 'friends': [{...}, {'id': 7, 'name': 'Devin', 'friends': [{...}, {...}]}, {'id': 9, 'name': 'Klein', 'friends': [{...}]}]}]}, {'id': 7, 'name': 'Devin', 'friends': [{...}, {'id': 8, 'name': 'Kate', 'friends': [{'id': 6, 'name': 'Hicks', 'friends': [{...}, {...}]}, {...}, {'id': 9, 'name': 'Klein', 'friends': [{...}]}]}]}]}]}]}]}]}

Try using classes instead of dicts.尝试使用类而不是字典。

class Person:
    def __init__(self, id, name):
        self.id = id
        self.name = name
        self.friends = []

    def __str__(self):
        return "*users[" + str(id) + "]"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM