【问题标题】:Searching in a list of multiple dictionaries在多个词典列表中搜索
【发布时间】:2016-10-26 17:11:25
【问题描述】:

我将多个字典从 .txt 文件导入到我的 python 文件中,然后我必须在所有字典中搜索一个键('name'),但我的代码只在第一个字典中搜索并相应地给出结果.我想知道是否有一种简单的方法来处理这种情况。立即提供帮助将不胜感激。当前代码和 .txt 文件中的数据如下所示:

elif option == 's':
        if 'name' in open('data.txt').read():
            sea = input ("Type a menu item name to search for: ")
            file = open('data.txt', 'r')
            data = json.load(file)
            file.close()
            for index, line in enumerate(data):
                if sea.lower() in line['name'].lower():
                    print (index, line['name'])
                    main()
                else:
                    print ('No such item exist')
                    main()
        else:
            print ("The list is empty")
            main()

字典:

[
  {
    "fat": 29,
    "carbohydrates": 45,
    "protein": 25,
    "sodium": 1040,
    "cholesterol": 75,
    "calories": 540,
    "name": "Big Mac"
  },
  {
    "fat": 47,
    "carbohydrates": 53,
    "protein": 33,
    "sodium": 1410,
    "cholesterol": 100,
    "calories": 760,
    "name": "Whopper"
  },
  {
    "fat": 80,
    "carbohydrates": 50,
    "protein": 650,
    "calories": 45,
    "cholesterol": 50,
    "sodium": 50,
    "name": "Icecream'"
  }
]

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。最值得注意的是,您发布的代码不足以重现问题。

标签: python dictionary search


【解决方案1】:

问题在于,您的第一次循环迭代是整个世界:它查看列表中的第一项,仅报告该搜索的成功或失败,然后递归调用主程序(即程序构建也很差)。

按照这个顺序尝试一些有逻辑的东西:

found = False
for index, line in enumerate(data):
    if sea.lower() in line['name'].lower():
        print (index, line['name'])
        found = True

if not Found: 
    print ('No such item exists')

最后,与其调用 ma​​in(),不如将其包装在一个 while 循环中,以测试程序的终止条件。

【讨论】:

  • 它正在工作,但我不确定在 while 循环中插入什么条件。你能帮我解决这个问题吗?
  • 好 -- 因为您的问题描述没有说明程序的终止条件;我正要问。也许 while option != 'q'?
  • 另外,感谢您记得接受并回答。接受和投票(关于答案和 cmets)有助于保持 SO 顺利运行。
【解决方案2】:

如果使用 Python 3,您可以使用专门为此目的设计的 ChainMap。并且可能比您使用的算法更有效。

我希望它被实现为“映射的映射”,其中顶级映射具有每个映射的键的合并索引,指向内存中的原始条目。可能在 C 中实现。重要的是对成员字典的更改会更新主字典中的索引。否则,您必须对每个 dict 进行迭代搜索。然后查找无法通过排序等进行优化。可以使用某种手表,例如如果 dict 的底层 C 对象旨在检查它是否是更改时链图的一部分,并通知。

【讨论】:

    猜你喜欢
    • 2023-02-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多