简体   繁体   English

如何在Python中更新字典值,让用户选择要更新的密钥,然后选择新值?

[英]How do I update a dictionary value having the user choose the key to update and then the new value, in Python?

I am trying to write a program where my brother and I can enter and edit information from our football game rosters to compare teams and manage players, etc. This is my first 'big' project i've tried. 我正在尝试编写一个程序,我和我的兄弟可以从我们的足球比赛名单中输入和编辑信息来比较球队和管理球员等。这是我尝试的第一个“大”项目。

I have a nested dictionary inside a dictionary, I'm able to get the user to create the dictionaries etc. But when i try to have the 'user' (via raw_input) go back to edit them I get stuck. 我在字典中有一个嵌套字典,我能够让用户创建字典等。但是当我尝试使用'user'(通过raw_input)返回编辑它们时,我会卡住。 Below i tried to put a simplified version of the code down of what i think is relevant to my error. 下面我尝试将代码的简化版本放在我认为与我的错误相关的内容之下。 If I need to put down a full version let me know. 如果我需要记下完整版,请告诉我。

player1 = {'stat1' : A, 'stat2' : 2, 'stat3' : 3} #existing players are the dictionaries 
player2 = {'stat1' : A, 'stat2' : 2, 'stat3' : 3} # containing the name of stat and its value
position1 = {'player1' : player1} # in each position the string (name of player) is the key and
position2 = {'player2' : player2} # the similarly named dict containing the statisics is the value
position = raw_input('which position? ') # user chooses which position to edit
if position == 'position1':
  print position1 # shows user what players are available to choose from in that position
  player = raw_input('which player? ') #user chooses player from available at that position
  if player == player1:
    print player # shows user the current stats for the player they chose
    edit_query = raw_input('Do you need to edit one or more of these stats? ')
    editloop = 0
    while editloop < 1: # while loop to allow multiple stats editing
      if edit_query == 'yes': 
        stat_to_edit = raw_input('Which stat? (If you are done type "done") ')
          if stat_to_edit == 'done': #end while loop for stat editing
            editloop = editloop +1
          else:
            new_value = raw_input('new_value: ') #user inserts new value

# up to here everything is working. 
# in the following line, player should give the name of the
# dictionary to change (either player1 or player2) 
# stat_to_edit should give the key where the matching value is to be changed
# and new_value should update the stastic
# however I get TypeError 'str' object does not support item assignment

            player[stat_to_edit] = new_value #update statistic
      else:  # end loop if no stat editing is wanted
        fooedit = fooedit + 1

of course when i say "should give..." etc I mean to say "I want it to give.." 当然,当我说“应该给......”等我的意思是说“我希望它给......”

In summary I want the user to choose the player to edit, choose the stat to edit, then choose the new value 总之,我希望用户选择要编辑的播放器,选择要编辑的统计数据,然后选择新值

The problems seems that after this line 问题似乎在这一行之后

player = raw_input('which player? ')

the player will be the string, containing what the user have typed in, and not the dictionary, like player1 . player将是字符串,包含用户输入的内容,而不是字典,如player1 This explains, why Python fails to assign to its part. 这解释了为什么Python无法分配给它的部分。 You can instead write like this: 你可以这样写:

player = raw_input('which player? ')
if player == 'player1': # these are strings!
  current_player = player1 # this is dictionary!
  ....
  current_player[...] = ... # change the dictionary

Also note, that the Python assignment to a name typically does no copy object, but only adds another name for the same existing object. 另请注意,对名称的Python赋值通常不会复制对象,而只会为同一现有对象添加另一个名称。 Consider this example (from Python console): 考虑这个例子(来自Python控制台):

>>> a = {'1': 1}
>>> a
{'1': 1}
>>> b = a
>>> b
{'1': 1}
>>> b['1'] = 2
>>> b
{'1': 2}
>>> a
{'1': 2}
>>>

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

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