搜索多个词典列表

时间:2016-10-26 17:11:25

标签: python dictionary search

我将.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'"
  }
]

2 个答案:

答案 0 :(得分:0)

问题是你已经使你的第一个循环迭代成为整个世界:它查看列表中的第一个项目,单独报告该搜索的成功或失败,然后递归调用主程序(这也是一个糟糕的程序建设。

在此订单上尝试使用逻辑:

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

最后,不要调用 main()将其包装在 while 循环中,以测试程序的终止条件。

答案 1 :(得分:0)

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

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