Python判断字典Composer值为列表/字符串的方法及代码问题排查
问题与解答:判断Python字典中Composer是字符串还是列表
问题背景
给出的Python字典对象:
ds_obj = { "Labels" : [ { "Label" : "pop", "People" : { "Composer" : "John" }, }, { "Label" : "classical", "People" : { "Composer" : [ "Johann", "Jason" ] }, }, { "Label" : "classical-2", "People" : { "Composer" : [ "Jacob" ] }, } ] }
需要遍历每个Label,判断对应的Composer是单个字符串还是列表,但以下代码把所有值都识别为列表,求问题原因和更高效的实现方式:
for label in ds_obj ['Labels']: if hasattr(label['People']['Composer'], "__len__"): print('IS ARRAY') else: print('NOT Array')
问题原因
你的判断逻辑有误——Python里字符串(str)同样拥有__len__属性,不管是字符串还是列表,hasattr(..., "__len__")都会返回True,所以所有情况都被错误判定为列表。
正确且高效的实现方式
方式1:直接判断类型(最可靠)
用isinstance()函数直接检查对象类型,这是Python中判断类型的标准做法:
for label in ds_obj['Labels']: composer = label['People']['Composer'] if isinstance(composer, list): print(f"Label {label['Label']}: IS ARRAY") # 对列表执行操作,比如遍历每个作曲家 for c in composer: print(f" - {c}") else: print(f"Label {label['Label']}: NOT Array") # 对字符串执行操作 print(f" - {composer}")
方式2:统一转为列表(简化业务逻辑)
如果后续操作需要统一处理成列表形式,直接把单个字符串包装成列表,省得分支判断,代码更简洁高效:
for label in ds_obj['Labels']: composer = label['People']['Composer'] # 统一转成列表,兼容单个字符串和列表两种情况 composers = composer if isinstance(composer, list) else [composer] # 后续直接按列表处理即可 print(f"Label {label['Label']} 的作曲家:") for c in composers: print(f" - {c}")
注意:避免使用type()判断
不要用type(composer) == list来判断,若Composer是列表的子类,这种判断会失效;而isinstance()能正确识别子类实例,兼容性更强。
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

