【问题标题】:Dictionary: TypeError: 'bool'/'nonetype object' not iterable when looping in dictionary字典:TypeError:'bool'/'nonetype object' 在字典中循环时不可迭代
【发布时间】:2018-01-23 18:26:48
【问题描述】:

对于下面的字典,

a1 = {'a2':{'name':'mic\xa0\xa0', 'age':'12\xa0\xa0', 'college':True, 'contact':''},
        'a3':{'name':'sen\xa0\xa0', 'age':'23\xa0\xa0','college':True,'contact':''}}

当在字典上循环并执行某些操作使bool 对象不可迭代时,如果从字典中删除布尔字段(college),则空字段(nonetype(contact) 对象不可迭代将出现错误)

def t1():
    a4 = {k : 
    {k2: ''.join([i if 32 < ord(i) < 126 else " " for i in v2])
    for k2, v2 in v.items()} for k, v in a1.items()
    }
    return a4

a5 = t1()
print(a5) 

任何帮助将不胜感激。

【问题讨论】:

  • 你想在这里达到什么目的?
  • v.items() 给出内部字典(例如{'name':'mic\xa0\xa0', ...}。因此,每个v2 是该字典中的每个值,其中一个是bool 类型。因此,当您尝试使用 for i in v2 迭代 bool 类型会出现错误。
  • @anmaxvl 删除非 ASCII 字符

标签: python dictionary


【解决方案1】:

只需稍作更改即可使用isinstance() 检查v2 是否为字符串。如果它是一个字符串,则迭代并执行您的操作。否则,原样返回。

例子:

def t1():
    a4 = {
        k : {
            k2: ''.join([i if 32 < ord(i) < 126 else " " for i in v2]) 
            if isinstance(v2, str) else v2 for k2, v2 in v.items()  
        } 
        for k, v in a1.items()
    }
    return a4

a5 = t1()

print(a5) 

输出:

{
  "a3": {
    "age": "23  ", 
    "contact": "", 
    "college": True, 
    "name": "sen  "
  }, 
  "a2": {
    "age": "12  ", 
    "contact": "", 
    "college": True, 
    "name": "mic  "
  }
}

您可能还想在join() 的结果中添加.strip(),以删除前导/尾随空格。

【讨论】:

  • 但布尔字段被排除在外..?
  • 我的错误@Prashant。我修好了,请检查编辑。
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 2019-12-08
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多