代码之家  ›  专栏  ›  技术社区  ›  amanb

大型JSON文件:dict值中的字符串搜索

  •  1
  • amanb  · 技术社区  · 7 年前

    我有一个很大的JSON文件,其中包含大约30000个项目,其中包括以下项目:

    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
    

    我到处寻找帮助,很多答案都指向使用 ijson 但我只能安装第三方库。有没有一种内存有效的替代方法来搜索dict中的子字符串 values

    只是想让你知道,它以前工作,但现在我得到这个错误的5次中的3次。因此,该错误会间歇性出现,但对于应用程序执行其工作来说,该错误相当频繁。JSON文件或代码没有任何变化,但是JSON文件大小增加了,这让我认为这可能是原因。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Filip Młynarski    7 年前

    bools (True of False)因此不能使用 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
    

    您可以在函数中首先检查值类型是否不是bool,如果是字符串则更好。

    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')]