检查字典值是否包含2个参数的函数

时间:2019-02-17 12:26:56

标签: python pandas

我想编写一个函数来检查是否满足2个值,然后执行查找第三个参数的最大值。例如:

myFunction(condition1, condition2, parameter)

我的数据保存在词典中(可以放进Data Frame,不知道什么是最好的方法。现在猜它是词典词典)。 condition1condition2具有多个值,例如

condition1看起来像:{0: ['pizza', 'pasta', 'salad'], 1: ['kebab', 'pasta', 'stew'],...} condition2看起来像:{0: ['italian'], 1: ['american','mexican', 'italian'],...} 参数(等级)如下:{0:67, 1:56, 2:32,...},并且 名称看起来像:{0:'macys',1:'maze',2:'mcdonalds'...}

基本上,我想找到服务'pizza'的最佳餐厅,它是'italian',并且'rating'最高(请返回餐厅名称)。

我唯一能得到的就是用下面的代码向我展示包含'pizza'的所有键:

[key for key, value in datadict["condition1"].items() if 'pizza' in value]

但是在第二个条件中添加and时:

def myfunction(condition1, condition2, highest):
    [key for key, value in datadict["condition1"].items() if condition1 in value] and [key for key, value in datadict["condition2"].items() if condition2 in value]

我得到一些奇怪的结果。另外,我尝试过这种方法,它得到的结果只是基于一种情况:

def func(condition1):
    for i in datadict["condition1"]: #reaching the keys of dict
        for x in datadict["condition1"][i]: #reaching every element in tuples
            if x==condition1: #if match found..
                print ("{} holding {}.".format(i,x)) #printing it..
funct('pizza')

输出:

8 holding pizza.
30 holding pizza.
33 holding pizza.

但是:

def func(condition1, condition2):
        for i in datadict["condition1"], j in datadict["condition2"]: #reaching the keys of dict
            for x in datadict["condition1"][i] and y in datadict["condition2"][j]: #reaching every element in tuples
                if x==condition1 and y==condition2: #if match found..
                    print ("{} holding {}.".format(i,x)) #printing it..
    funct('pizza', 'italian')

我得到:

  

NameError:名称'j'未定义

如何正确检查其他条件并返回名称而不是密钥?

2 个答案:

答案 0 :(得分:2)

您需要反转数据集。您的ID指向属性,但正在搜索属性以将您指向ID。

根据您的条件构建sets,因此您可以将它们相交:

cuisine_to_id = {}
for id, cuisines in condition1.items():
    for c in cuisines:
        cuisine_to_id.setdefault(c, set()).add(id)

style_to_id = {}
for id, styles in condition2.items():
    for s in styles:
         style_to_id.setdefault(s, set()).add(id)

因此,现在您有了字典,这些字典的键像'pizza'指向一组ID({0, 2, ...})。您要一次执行此操作,在最初加载此数据后,无需重复构建这些集合。

如果您是从另一个餐馆数据集中构建condition1condition2字典,则只需构建上面的“名称到ID集”映射即可。 condition*字典对其他所有功能都不是那么有用。

挑选匹配的餐馆是一个设置操作,&为我们提供了满足两个条件的餐馆的交集:

matches = cuisine_to_id['pizza'] & style_to_id['italian']

然后从匹配的ID中找到评分最高的餐厅ID,然后将该ID映射到名称:

return names[max(matches, key=parameter.get)]

顺便说一句,这是关系数据库绝对擅长的操作。您想将此信息放入SQL数据库中。 Python包含嵌入式sqlite3 database library,无需在此处设置单独的服务器。

然后您可以运行类似的查询

SELECT r.name
FROM restaurants r
INNER JOIN restaurant_cuisines rc ON rc.restaurant_id = r.id
INNER JOIN cuisines c ON rc.cuisine_id = c.id
INNER JOIN restaurant_styles rs ON rs.restaurant_id = r.id
INNER JOIN styles s ON rs.style_id = s.id
WHERE c.name = 'pizza' AND s.name = 'italian'
ORDER BY r.rating DESC
LIMIT 1

这可能看起来有些令人生畏,但它真的会非常快速有效。

答案 1 :(得分:0)

您可以使用列表推导找到符合条件的food1和food2键,然后返回在rating中具有最高值的餐厅名称。

food1 = {0: ['pizza', 'pasta', 'salad'], 1: ['kebab', 'pasta', 'stew'], 2:['sushi', 'pizza']}
food2 = {0: ['italian'], 1: ['american','mexican', 'italian'], 2: ['polish', 'italian']}
rating = {0:67, 1:56, 2:32}
names = {0:'macys',1:'maze',2:'mcdonalds'}

def myFunction(condition1, condition2):
    filtered = [k for k, v in food1.items() if condition1 in v and condition2 in food2[k]]

    if not filtered:
        return

    return names[max(filtered, key=rating.get)]

print(myFunction('pizza', 'italian'))