我有一个大型JSON文件,其中包含约30,000个项目,其中包括:
d = {"1102344": "Install 3245 xxx", "23456": "Install 7896 zzz", "90887": "Install 6655 ddd"}
我一直在尝试为与key
和value
匹配的商品获取num
,query
,如以下示例代码所示:
def test(num, query):
l = [(k,v) for k,v in d.items() if num in v and v.strip().startswith(query)]
return l
test('3245','Install')
#Output: [('1102344', 'Install 3245 xxx')]
上面的代码作为字典d
的项目很少。但是,当我为数据集运行它时,出现以下错误:
argument of type `bool` is not iterable
我一直在搜索有关SO的帮助,许多答案都指向使用ijson
,但是我只能安装第三方库。有没有一种内存有效的替代方法可以在字典values
中搜索子字符串?我已经用尽了尝试其他方法的选项,并且不确定为什么会出现此错误。 JSON已排序且有效。
只是让您知道,它以前曾经可以工作,但是现在我得到5次3次此错误。因此,该错误间歇出现,但对于应用程序执行其工作来说非常频繁。 JSON文件或代码没有任何变化,但是JSON文件的大小增加了,这使我认为这可能是原因。
答案 0 :(得分:1)
json的大小在这里不是问题,问题可能是您的字典的某些值是bools
(真假),因此您不能通过使用strip()
或字符串来对待它们startswith()
。在这里,我在字典中添加了'12345': False
条目,以引发此错误。
d = {"1102344": "Install 3245 xxx", '12345': False, "23456": "Install 7896 zzz", "90887": "Install 6655 ddd"}
def test(num, query):
l = [(k,v) for k,v in d.items() if type(v) is not bool and num in v and v.strip().startswith(query)]
return l
print(test('3245','Install'))
输出:
TypeError: argument of type 'bool' is not iterable
您可以做的是在函数中首先检查值类型是否不是布尔值,或者更好地是它的字符串。
l = [(k,v) for k,v in d.items() if type(v) is str and num in v and v.strip().startswith(query)]
输出:
[('1102344', 'Install 3245 xxx')]