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

如何在多词典列表中对词典的每个值进行模糊搜索?

  •  4
  • user714852  · 技术社区  · 11 年前

    我有一份字典清单。我正在尝试对所述字典值进行“模糊”搜索,并返回完整的字典。

    因此,如果我有一个dicts列表,如下所示:

    [
    {"Name":"Arnold", "Age":"52", "Height":"160"}, 
    {"Name":"Donald", "Age":"52", "Height":"161"}, 
    {"Name":"Trevor", "Age":"22", "Height":"150"}
    ]
    

    “”的搜索词 nol公司 “应该返回

    {"Name":"Arnold", "Age":"52", "Height":"160"} 
    

    而“”的搜索词 52 “应返回:

    {"Name":"Arnold", "Age":"52", "Height":"160"} 
    {"Name":"Donald", "Age":"52", "Height":"161"}
    

    我知道我可以使用itertions搜索特定关键字处的值,只是我不清楚如何在字典中搜索所有关键字/值(不知道关键字名称),然后在任何关键字中匹配的情况下返回所述字典。这在python中可能吗?

    3 回复  |  直到 11 年前
        1
  •  4
  •   arshajii    11 年前

    你可以用这样的东西

    >>> l = [
    ... {"Name":"Arnold", "Age":"52", "Height":"160"}, 
    ... {"Name":"Donald", "Age":"52", "Height":"161"}, 
    ... {"Name":"Trevor", "Age":"22", "Height":"150"}
    ... ]
    >>>
    >>> [d for d in l if any("nol" in v for v in d.values())]
    [{'Age': '52', 'Name': 'Arnold', 'Height': '160'}]
    >>>
    >>> [d for d in l if any("52" in v for v in d.values())]
    [{'Age': '52', 'Name': 'Arnold', 'Height': '160'}, {'Age': '52', 'Name': 'Donald', 'Height': '161'}]
    
        2
  •  2
  •   Oleh Prypin    11 年前

    这是我的版本,它不会同时将所有结果保存在列表中,而是根据需要生成结果。

    import itertools
    
    database = [
        {"Name":"Arnold", "Age":"52", "Height":"160"}, 
        {"Name":"Donald", "Age":"52", "Height":"161"}, 
        {"Name":"Trevor", "Age":"22", "Height":"150"},
    ]
    
    def search(s):
        s = s.lower() # it is a nice feature to ignore case
        for item in database:
            if any(s in v.lower() for v in item.values()): # if any value contains s
                yield item # spit out the item — this is a generator function
    
    # iterate over at most 5 first results
    for result in itertools.islice(search("52"), 5):   
        print(result)
    
    {'Height': '160', 'Age': '52', 'Name': 'Arnold'}
    {'Height': '161', 'Age': '52', 'Name': 'Donald'}
    
        3
  •  1
  •   Brionius    11 年前

    另一个略有不同的选项:

    searchTerm = "nol"
    unusedCharacter = "\n"  # This should be a character that will never appear in your search string.
    # Changed this to a generator to avoid searching the whole dict all at once:
    results = (d for d in l if searchTerm in unusedCharacter.join(d.values()))
    
    # Produce a limited number of results:
    limitedResults = []
    maxResults = 5
    for k, result in enumerate(results):
        if k == maxResults:
            break
        limitedResults.append(result)