【问题标题】:Setting python variable from array dict value?从数组dict值设置python变量?
【发布时间】:2012-03-01 20:53:27
【问题描述】:

第一次学习python,我正在阅读JSON并正确解码。我可以使用第一个 for 循环遍历名称,因此我认为我正确获取了名称的值。当我尝试将该值设置为变量时,出现以下错误。

Traceback (most recent call last):
  File "./logger.py", line 70, in <module>
    winnerName = jsonData['players'][winner].get('name')
TypeError: list indices must be integers, not unicode

Python 代码:

jsonData = json.load(open('file.json'))

## Functions correctly and prints each name out.
for i in range(0,7):
  print jsonData['players'][i].get('name')

gameMatches = jsonData['games'][game]['matches']
for match in gameMatches:
  winnerBool = 1
  winner = -1
  loser = -1
  winnerName = ""
  loserName = ""
  matchCounter = 1

  ## Set the winner first then check to see who lost
  for key, value in sorted(match.iteritems(), reverse=True):
    if winnerBool:
      winner = value
  ## This is where the error keeps pointing
      winnerName = jsonData['players'][winner].get('name')
      winnerBool = 0
    elif winner != value:
      loserName = jsonData['players'][loser].get('name')
      loser = value

  print winnerName
  print loserName

JSON 文件:

{
   "players":[
      {"name":"Donatello","img":"\/img\/players\/1.jpg","rol":"\/img\/players\/r1.jpg"},
      {"name":"Leonardo","img":"\/img\/players\/2.jpg","rol":"\/img\/players\/r2.jpg"},
      {"name":"Michelangelo","img":"\/img\/players\/3.jpg","rol":"\/img\/players\/r3.jpg"},
      {"name":"Raphael","img":"img\/players\/4.jpg","rol":"img\/players\/r4.jpg"},
      {"name":"Shredder","img":"\/img\/players\/5.jpg","rol":"\/img\/players\/r5.jpg"},
      {"name":"Rocksteady","img":"\/img\/players\/6.jpg","rol":"\/img\/players\/r6.jpg"},
      {"name":"Bebop","img":"\/img\/players\/7.jpg","rol":"\/img\/players\/r7.jpg"},
      {"name":"Foot Soldier","img":"\/img\/players\/8.jpg","rol":"\/img\/players\/r8.jpg"}
      ],
   "games":[
      {"matches":[
         {"player1":"0","player2":"2","winner":"0"},
         {"player1":"1","player2":"3","winner":"3"},
         {"player1":"4","player2":"5","winner":"4"},
         {"player1":"6","player2":"7","winner":"6"},
         {"player1":"0","player2":"3","winner":"0"},
         {"player1":"4","player2":"6","winner":"4"},
         {"player1":"0","player2":"4","winner":"0"}
         ]
      },
      {"matches":[
         {"player1":"0","player2":"2","winner":"2"},
         {"player1":"1","player2":"3","winner":"3"},
         {"player1":"4","player2":"5","winner":"4"},
         {"player1":"6","player2":"7","winner":"7"},
         {"player1":"2","player2":"3","winner":"2"},
         {"player1":"4","player2":"7","winner":"4"},
         {"player1":"2","player2":"4","winner":"4"}
         ]
      }
   ]
}

【问题讨论】:

  • 你能发布完整的回溯吗?还有完整的JSON 文件?因为您发布的内容没有'games' 部分,但您的代码引用了jsonData['games']
  • 在不检查您是否实际访问正确数据的情况下,您的 JSON 不包含任何数字,仅包含字符串。所以winner 包含一个字符串。您必须先将其转换为数字。
  • “足族”?你不是说“步兵”吗?
  • 抱歉剪掉了,不知道要包含多少。我添加了 fulltraceback 和 JSON。谢谢伊格纳西奥大声笑没有注意到我输入的是单数而不是单数。

标签: python json


【解决方案1】:

使用

winner = int(value)

"1"(字符串)转换为1(整数)

已编辑澄清:

当你这样做时......

for key, value in sorted(match.iteritems(), reverse=True):
    #...

...您的键和值变量将是字符串。我假设您正在迭代 JSON 的这一部分:

{"matches":[
     {"player1":"0","player2":"2","winner":"0"},
     {"player1":"1","player2":"3","winner":"3"},

因此,当你分配...

winner = value

...并尝试查找...

winnerName = jsonData['players'][winner].get('name')

...你得到一个...

TypeError: list indices must be integers, not unicode

...因为你在说:

x = list["4"]

应该说的地方:

x = list[4]

【讨论】:

  • 抱歉,我没有提供足够的信息来说明问题已被编辑以澄清问题所在。我正在尝试获取玩家数组中的名称值并将其设置为变量。
  • 哦,哇,现在说得通了。您确实回答了它,但我认为问题在于存储名称而不是赢家/输家“int”是一个字符串。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2013-01-02
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 2013-01-26
  • 2023-03-09
相关资源
最近更新 更多