【问题标题】:Updating a list entry as a value to a nested dictionary将列表条目作为值更新到嵌套字典
【发布时间】:2017-12-09 14:28:56
【问题描述】:

我有以下嵌套字典:facebook。您会注意到其中一个键值对是friends:[“friend1”、“friend2”等)。在尝试将各种朋友附加到列表中时,它会这样做,但格式不正确。

问题 1:有人可以提供解决此问题的答案/解决方案吗?附加给定信息的所需输出应与字典中 John 和 Mary(键)的格式相同。

注意:键是:John, Mary(在 register_user 中,我尝试添加键:Mr x)如图所示,每个人(键)的朋友都存储在列表中。我不确定的是,当您将键和值“附加”到字典时,您可以添加值,但是如何添加键,或者在添加值时引用键?

到目前为止的代码:

facebook={'John': {'Friends': ['Bobby', 'Charlie', 'Dalia', 'Ellie'],
            'Gender': 'Male',
            'Hobby': 'Chess'},


            'Mary': {'Friends': ['Bobby', 'Xavier', 'Dalia', 'Zanpoodle'],
            'Gender': 'Female',
            'Hobbies': 'Chequers'}}

def main():
  register_user()

#create a dictionary that stores the profiles of users 


def register_user():
  name=input("Enter Name:")
  friend1=input("Friend 1:")
  friend2=input("Friend 2:")
  friend3=input("Friend 3:")
  friend4=input("Friend 4:")
  #gender=input("Enter Gender:")
  #hobby=input("Enter your main hobby:")

  #this adds an entry to the dictionary
  facebook.update({name:[friend1,friend2,friend3,friend4]})
  for i in facebook.items():
    print(i)

  print()

  print(facebook.items())


main()

错误输出: *如前所述,我希望在 X 先生的新条目中将 Friend1、Friend 2 等添加到 key:friends 的列表值中。

Enter Name: Mr X
Friend 1: Friend1
Friend 2: Friend2
Friend 3: Friend3
Friend 4: Friend4
('John', {'Friends': ['Bobby', 'Charlie', 'Dalia', 'Ellie'], 'Gender': 'Male', 'Hobby': 'Chess'})
('Mary', {'Friends': ['Bobby', 'Xavier', 'Dalia', 'Zanpoodle'], 'Gender': 'Female', 'Hobbies': 'Chequers'})
('Mr X', ['Friend1', 'Friend2', 'Friend3', 'Friend4'])

dict_items([('John', {'Friends': ['Bobby', 'Charlie', 'Dalia', 'Ellie'], 'Gender': 'Male', 'Hobby': 'Chess'}), ('Mary', {'Friends': ['Bobby', 'Xavier', 'Dalia', 'Zanpoodle'], 'Gender': 'Female', 'Hobbies': 'Chequers'}), **('Mr X', ['Friend1', 'Friend2', 'Friend3', 'Friend4'])])**

更新: 我也试过这个: facebook.update({name:{Friends:[friend1,friend2,friend3,friend4]}})

但出现以下错误:

Traceback (most recent call last):
  File "python", line 35, in <module>
  File "python", line 11, in main
  File "python", line 26, in register_user
NameError: name 'Friends' is not defined

再试一次:

facebook[name]={'Friends':[friend1,friend2,friend3,friend4]}

很遗憾仍然是一个错误:

Traceback (most recent call last):
  File "python", line 35, in <module>
  File "python", line 11, in main
  File "python", line 27, in register_user
TypeError: 'type' object does not support item assignment

最后,我还尝试将名称添加到列表中,然后像这样附加此列表:

   newfriends=[friend1,friend2,friend3,friend4]
   facebook.update({name:{[newfriends]})

导致语法错误

除了尝试使用 append:

friendslist=[friend1,friend2,friend3,friend4]
  facebook['name'].append(friendlist)

错误:

KeyError: 'name'

这个尝试接近了,但并不完全:

facebook.update({"Name":name,"Friends":[friend1,friend2,friend3,friend4]})

产生以下输出:

Enter Name: t
Friend 1: 1
Friend 2: 2
Friend 3: 3
Friend 4: 4
{'John': {'Friends': ['Bobby', 'Charlie', 'Dalia', 'Ellie'], 'Gender': 'Male', 'Hobby': 'Chess'}, 'Mary': {'Friends': ['Bobby', 'Xavier', 'Dalia', 'Zanpoodle'], 'Gender': 'Female', 'Hobbies': 'Chequers'}, 'Name': 't', 'Friends': ['1', '2', '3', '4']}

澄清:我意识到可能有几种不同的方法可以解决这个问题。我想要一个简单的解决问题的方法不引入任何新的东西(比如 lambda 或必须导入任何东西)

【问题讨论】:

    标签: list dictionary nested key


    【解决方案1】:

    解决问题的一种方法是将facebook 字典转换为defaultdict

    from collections import defaultdict
    
    dd_facebook = defaultdict(lambda: {"Friends": []}, facebook) 
    

    要更新好友列表,您只需执行以下操作:

    dd_facebook[name]['Friends'].extend([friend1,friend2,friend3,friend4])
    

    【讨论】:

    • 这不起作用。使用输入:X 先生,朋友 1,朋友 2,朋友 3,朋友 4,它会导致:KeyError:'X 先生'。我认为我的问题可以与赞成票有关……这对人们非常有帮助,我确实检查了重复项。 :)
    • 谢谢你,但我只想要一个按原样解决问题的答案,而不需要引入 lambda 和导入。出于教学目的,这应该相对简单——我需要做的就是在字典中添加一个带有多个键的条目!我希望有人可以提供帮助
    • @MissComputing 您正在寻找最 Pythonic 的方式。这个答案非常pythonic。如果你想要别的东西,你的问题应该更准确。
    • 这当然是另一种方法,虽然尚未验证,但我想对上面的代码进行简单的修复——我认为这是一种语法而不是其他错误?感谢您的不必要的否决(当您的答案最初是错误的时,我没有否决您),现在欢迎您投赞成票:最后,我已经澄清了我的问题,以免引入除已有内容之外的任何内容代码
    猜你喜欢
    • 2017-06-17
    • 2020-12-30
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多