【问题标题】:strange error in loops [duplicate]循环中的奇怪错误[重复]
【发布时间】:2017-02-11 14:07:16
【问题描述】:

我有字典

{
    "count_casinos": 4,
    "casinos": {
        "16": {
            "fields": [
                {"casino_logo": "assets/images/crown.png"},
                {"raiting_casino": "9"},
                {"bonus_code": "AX7772"},
                {"bonus_summa": "200"},
                {"bonus_min_depozit": "1000000"},
                {"bonus_veizdjer": "4"}],
            "title": "Royal casino casino1"},
        "17": {
            "fields": [
                {"casino_logo": "assets/images/crown.png"},
                {"raiting_casino": "8.2"},
                {"bonus_code": "AX777"},
                {"bonus_summa": "200"},
                {"bonus_min_depozit": "1000000"},
                {"bonus_veizdjer": "4"}],
            "title": "Royal casino casino3"},
        "18": {
            "fields": [
                {"casino_logo": "assets/images/crown.png"},
                {"raiting_casino": "9.3"},
                {"bonus_code": "AX7772"},
                {"bonus_summa": "200"},
                {"bonus_min_depozit": "1000000"},
                {"bonus_veizdjer": "4"}],
            "title": "Royal casino casino2"},
        "15": {
            "fields": [
                {"casino_logo": "assets/images/crown.png"},
                {"raiting_casino": "9.9"},
                {"bonus_code": "AX777"},
                {"bonus_summa": "200"},
                {"bonus_min_depozit": "1000000"},
                {"bonus_veizdjer": "4"}],
            "title": "Royal casino casino4"}}}

当我尝试循环时

     for k,v in casino.iteritems():
         for iterm in v['fields']:
             print iterm['bonus_code']

key:error

怎么了?

【问题讨论】:

  • casino 是提供数据的字典吗?
  • @Aaron 问题不在于密钥不存在。 OP 只是没有深入到嵌套字典中来访问它。
  • 你不够深入,for k, v in casino.iteritems(): 只会迭代一次,对于 16 键。
  • 第一项:` "count_casinos": 4` 将没有['fields']
  • 另外,第二个循环会分别查询列表中的每个dict,其中只有一个有'bonus_code'字段,所以其他的都会产生key index错误

标签: python dictionary


【解决方案1】:

如果您遍历v['fields'],每个项目将是只有一个键的dict 对象,并且只有一个项目有'bonus_code' 键。

轻微的改变不会让你出错

 for k,v in casino.iteritems():
     for iterm in v['fields']:
         if 'bonus_code' in iterm: print iterm['bonus_code']

注意:如果 casino 是 initial_data dict .get('casinos')

更新

我猜测 OP 的 casino 变量是

data = {"count_casinos": 4, "casinos": {"16": {"fields": [{"casino_logo": "assets/images/crown.png"}, {"raiting_casino": "9"}, {"bonus_code": "AX7772"}, {"bonus_summa": "200"}, {"bonus_min_depozit": "1000000"}, {"bonus_veizdjer": "4"}], "title": "Royal casino casino1"}, "17": {"fields": [{"casino_logo": "assets/images/crown.png"}, {"raiting_casino": "8.2"}, {"bonus_code": "AX777"}, {"bonus_summa": "200"}, {"bonus_min_depozit": "1000000"}, {"bonus_veizdjer": "4"}], "title": "Royal casino casino3"}, "18": {"fields": [{"casino_logo": "assets/images/crown.png"}, {"raiting_casino": "9.3"}, {"bonus_code": "AX7772"}, {"bonus_summa": "200"}, {"bonus_min_depozit": "1000000"}, {"bonus_veizdjer": "4"}], "title": "Royal casino casino2"}, "15": {"fields": [{"casino_logo": "assets/images/crown.png"}, {"raiting_casino": "9.9"}, {"bonus_code": "AX777"}, {"bonus_summa": "200"}, {"bonus_min_depozit": "1000000"}, {"bonus_veizdjer": "4"}], "title": "Royal casino casino4"}}}
casino = data.get('casinos')

因为如果casino 是 OP 提供的初始 dict,那么 OP 将得到另一个错误(TypeError),因为 data['count_casinos'] 的值是 intint 没有 @987654335 @ 方法 这将引发TypeError

【讨论】:

  • 你测试过这个吗? TypeError: 'int' object has no attribute '__getitem__'
  • @roganjosh 我在答案底部添加了一条注释。因为casino 最有可能是键为'casinos' 的初始数据字典的值,所以如果不是,OP 将改为使用TypeError
  • 其他键呢?
  • @VladleeleeLee 你发布了一个引发错误的代码,问题是你为什么得到。我回答了。你的程序的全部目的是未知的。
【解决方案2】:

您对嵌套字典的了解不够深入。如果您只对casinos 数据部分感兴趣,那么这样的方法对您有用。

for k,v in casino['casinos'].iteritems():
    data_list = v.get('fields')

    # If you know the list index is consistent
    print data_list[2].get('bonus_code')

    #otherwise
    for item in data_list:
        if 'bonus_code' in item.keys():
            print item['bonus_code']

【讨论】:

  • 其他键呢?
  • @VladleeleeLee 我不知道你在问我什么。我的代码完成了您问题中的任务;如果您想对其他键做类似的事情,那么您只需要更改我的答案结构以使其适应您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
相关资源
最近更新 更多