我试图将一些字符串/字符串与字符串匹配到一个类别。我已经创建了一个简单的例子,说明我正在尝试做什么以及我遇到的问题。
我正在尝试根据单词进行匹配,并为匹配指定一个类别,然后选择匹配率最高的类别。
不止一个类别的问题可以具有最高价值,我的代码只选择列表中的第一个。获得两个项目然后再次开始检查字典似乎是错误的。
如果我正朝着正确的方向前进,或者有更好的方法,有人可以建议我吗?
categorys = {
'fruits': ['apple', 'banana', 'orange', 'pear'],
'chocolate': ['mars', 'kitkat', 'areo'],
'drinks': ['coffee', 'tea', 'orange', 'coke']
}
# create a diction of points for each category and set to 0
points = {}
for key, value in categorys.items():
points[key] = 0
# calulate points for category
# key = category, value = style
for key, values in categorys.items():
if 'orange' in key.lower() or 'drink' in values:
points[key] += 1
# get category with the highest point although it just grabs the first item
calculated_category = max(points.iterkeys(), key=(lambda key: points[key]))
print calculated_category
修改
更新了答案中的代码
categorys = {
'fruits': ['apple', 'banana', 'orange', 'pear'],
'chocolate': ['mars', 'kitkat', 'areo'],
'drinks': ['coffee', 'tea', 'orange', 'coke']
}
# create a diction of points for each category and set to 0
points = {}
for key, value in categorys.items():
points[key] = 0
# calulate points for category
# key = category, value = style
for key, values in categorys.items():
if 'drink' in key.lower()
points[key] += 1
if 'orange' in values:
points[key] += 1
# get category with the highest point although it just grabs the first item
# max(points.iterkeys(), key=(lambda key: points[key]))
max_value = max(points.values())
[k for k, v in points.iteritems() if v == max_value]
答案 0 :(得分:0)
您可以使用max
获取最大points
值,然后使用列表推导来获取具有该值的所有项目。
max_value = max(points.values())
calculated_category = [k for k, v in points.iteritems() if v == max_value]
print calculated_category
输出为['fruits', 'drinks', 'chocolate']
,如您的示例所示,它们似乎都具有相同的points
0
值;不确定这是故意还是其他问题。如果您将条件更改为if 'drink' in key.lower() or 'orange' in values:
,这似乎更有意义,那么输出为['fruits', 'drinks']
。
答案 1 :(得分:0)
我在考虑您的输入将是: -
您可以继续: -
cat, item = raw_input() #you enter fruits, banana
for key, values in categorys.items():
if cat == key.lower() and item in values:
points[key] += 1
# get category with the highest point although it just grabs the first item
calculated_category = max(points.items(), key = lambda item_tuple: item_tuple[1])
print calculated_category
答案 2 :(得分:0)
代码中的一些附加点:
演示:
>>> points = { key:0 for key in categorys }
>>> points
{'fruits': 0, 'drinks': 0, 'chocolate': 0}
>>>
无需为每个键分配0
值。 Link
演示:
>>> import collections
>>> points = collections.defaultdict(int)
>>> points["drink"]
0
>>> points["drink"] += 1
>>> points["drink"]
1
iteritems()
方法迭代键和值字典(iteams()
将返回元组列表)答案 3 :(得分:0)
如果您想要针对您的类别测试许多像"orange"
和"drink"
这样的字词,我建议制作另一个字词,从字词映射到类别列表(反之)你当前的词典)这将允许您进行非常快速的测试,以查看单词所在的类别(如果有),而无需进行大量迭代。
from collections import Counter
categorys = {
'fruits': ['apple', 'banana', 'orange', 'pear'],
'chocolate': ['mars', 'kitkat', 'areo'],
'drinks': ['coffee', 'tea', 'orange', 'coke']
}
words_to_cats = {}
for cat, words in categorys.items():
for word in words:
words_to_cats.setdefault(word, []).append(cat)
def find_best_category(iterable_of_words):
score = Counter()
for word in iterable_of_words:
score.update(words_to_cats.get(word, [])) # count matches in the word list
for cat in categorys: # check for partial matches in the category name
if word in cat:
score[cat] += 1
return score.most_common(1)
请注意,这将只返回一个项目,如果有一个确切的关系,它将在得分最高的那些中任意选择一个获胜类别。在您的示例中(输入为['orange', 'drink']
),没有关系,它会选择"drinks"
,因为这两个词都与该类别匹配(一个与“橙色”相关,一个在与类别名称的部分匹配。)