我想编写一个函数来检查是否满足2个值,然后执行查找第三个参数的最大值。例如:
myFunction(condition1, condition2, parameter)
我的数据保存在词典中(可以放进Data Frame
,不知道什么是最好的方法。现在猜它是词典词典)。 condition1
和condition2
具有多个值,例如
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'未定义
如何正确检查其他条件并返回名称而不是密钥?
答案 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, ...}
)。您要一次执行此操作,在最初加载此数据后,无需重复构建这些集合。
如果您是从另一个餐馆数据集中构建condition1
和condition2
字典,则只需构建上面的“名称到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'))