Python 如何根据字典对列表中的单词进行分类?

Python 如何根据字典对列表中的单词进行分类?,python,dictionary,Python,Dictionary,假设我有一本字典,其中键是一个类别名称,值是该类别中的单词。例如: words={ 'seasons':('summer','spring','autumn','winter'), 'rooms':('kitchen','loo','livingroom','hall','diningroom','bedroom'), 'insects':('bee','butterfly','beetle')} 对于任何给定的输入,我想创建一个包含两项的列表,其中第一项是值字,第二项

假设我有一本字典,其中键是一个类别名称,值是该类别中的单词。例如:

words={
    'seasons':('summer','spring','autumn','winter'),
    'rooms':('kitchen','loo','livingroom','hall','diningroom','bedroom'),
    'insects':('bee','butterfly','beetle')}
对于任何给定的输入,我想创建一个包含两项的列表,其中第一项是值字,第二项是关键字。例如,预期输出应为:

input: kitchen
output: ['kitchen','rooms']

input: bee
output: ['bee','insects']
我检查了问题,但所有答案都适用于每个键有1个值的字典

我尝试了以下简单的封闭式代码:

word=input('Enter a word: ')
word_pair=[]
word_pair.append(word)
if word in (words['seasons']):
    index=0
elif word in (words['rooms']):
    index=1
elif word in (words['insects']):
    index=2
else:
    index=3
try:
    key_val=list(words.keys())[index]
    word_pair.append(key_val)
except IndexError:
    word_pair.append('NA')

print(word_pair)
显然,这段代码只适用于这个特定的字典。如果我想添加一个类别,我必须添加一个elif子句。如果我想更改一个类别的名称或它们的顺序,删除一个,合并两个或更多,等等,我必须手工调整一大堆东西

有没有更通用的方法来实现这一点


非常感谢您的帮助。

您可以这样做:

单词={
‘季节’:(‘夏天’、‘春天’、‘秋天’、‘冬天’),
‘房间’:(‘厨房’、‘厕所’、‘客厅’、‘大厅’、‘餐厅’、‘卧室’),
‘昆虫’:(‘蜜蜂’、‘蝴蝶’、‘甲虫’)
def查找目录(word):
对于类别,文字中的项目。项目()
如果项目中有单词:
退货类别
word=输入('输入一个单词:')
打印(查找目录(word))

说明:
words.items()
为字典中的每个键返回一个元组(键、值)。在本例中,值是一个列表。因此,我们可以使用
in
操作符来查找
单词是否在该列表中。如果是,只需返回键。

您可以这样做:

单词={
‘季节’:(‘夏天’、‘春天’、‘秋天’、‘冬天’),
‘房间’:(‘厨房’、‘厕所’、‘客厅’、‘大厅’、‘餐厅’、‘卧室’),
‘昆虫’:(‘蜜蜂’、‘蝴蝶’、‘甲虫’)
def查找目录(word):
对于类别,文字中的项目。项目()
如果项目中有单词:
退货类别
word=输入('输入一个单词:')
打印(查找目录(word))

说明:
words.items()
为字典中的每个键返回一个元组(键、值)。在本例中,值是一个列表。因此,我们可以使用
in
操作符来查找
单词是否在该列表中。如果是,只需返回键。

您可以迭代字典键:

words={
    'seasons':('summer','spring','autumn','winter'),
    'rooms':('kitchen','loo','livingroom','hall','diningroom','bedroom'),
    'insects':('bee','butterfly','beetle')}

search_text = input("input: ")

for key in words.keys():
    if search_text in words[key]:
        print("output: {0}".format([search_text,key]))

您可以迭代字典键:

words={
    'seasons':('summer','spring','autumn','winter'),
    'rooms':('kitchen','loo','livingroom','hall','diningroom','bedroom'),
    'insects':('bee','butterfly','beetle')}

search_text = input("input: ")

for key in words.keys():
    if search_text in words[key]:
        print("output: {0}".format([search_text,key]))

您可以将generator与解包一起使用:

inp = input()
result, *_ = ([inp, k] for k, v in words.items() if inp in v)
最好与发电机一起使用,因为在找到第一个匹配项后,发电机将停止运行:

result = next([inp, k] for k, v in words.items() if inp in v)

您可以将generator与解包一起使用:

inp = input()
result, *_ = ([inp, k] for k, v in words.items() if inp in v)
最好与发电机一起使用,因为在找到第一个匹配项后,发电机将停止运行:

result = next([inp, k] for k, v in words.items() if inp in v)

您可以在
中使用
进行测试,而不是使用精确匹配(请参阅下面代码中的
值中的单词
),并且您可能还希望包括某种检查,以确保只有一个匹配键,如果有,请使用第一个匹配键

words = {
    'seasons':('summer','spring','autumn','winter'),
    'rooms':('kitchen','loo','livingroom','hall','diningroom','bedroom'),
    'insects':('bee','butterfly','beetle')}

word = 'kitchen'

keys = [key for key, value in words.items() if word in value]

if len(keys) != 1:
    raise ValueError

word_pair = [word, keys[0]]

print(word_pair)
给出:

['kitchen', 'rooms']

您可以在
中使用
进行测试,而不是使用精确匹配(请参阅下面代码中的
值中的单词
),并且您可能还希望包括某种检查,以确保只有一个匹配键,如果有,请使用第一个匹配键

words = {
    'seasons':('summer','spring','autumn','winter'),
    'rooms':('kitchen','loo','livingroom','hall','diningroom','bedroom'),
    'insects':('bee','butterfly','beetle')}

word = 'kitchen'

keys = [key for key, value in words.items() if word in value]

if len(keys) != 1:
    raise ValueError

word_pair = [word, keys[0]]

print(word_pair)
给出:

['kitchen', 'rooms']

您可以使用以下命令反转该命令:

>>> {s_v:k for k,v in words.items() for s_v in v} 
{'summer': 'seasons', 'spring': 'seasons', 'autumn': 'seasons', 'winter': 'seasons', 'kitchen': 'rooms', 'loo': 'rooms', 'livingroom': 'rooms', 'hall': 'rooms', 'diningroom': 'rooms', 'bedroom': 'rooms', 'bee': 'insects', 'butterfly': 'insects', 'beetle': 'insects'}

然后在倒置的字典中查找您的输入。

您可以使用以下命令反转该字典:

>>> {s_v:k for k,v in words.items() for s_v in v} 
{'summer': 'seasons', 'spring': 'seasons', 'autumn': 'seasons', 'winter': 'seasons', 'kitchen': 'rooms', 'loo': 'rooms', 'livingroom': 'rooms', 'hall': 'rooms', 'diningroom': 'rooms', 'bedroom': 'rooms', 'bee': 'insects', 'butterfly': 'insects', 'beetle': 'insects'}

然后在倒排的字典中查找输入。

另一种方法是将输入字典转换为倒排逻辑:使值成为键,键成为值

因此,解决方案如下:

def反转dic(索引):
新的_dic={}
对于index.items()中的k,v:
对于v中的x:
新的dic.setdefault(x,[])。追加(k)
然后你会做:

index=invert_dic(字)#线性时间,O(n)
word=输入('输入一个单词:')
categories=index.get(word,['None'])#常数时间,O(1)
print(“,”.join(f“您的单词在这些类别中:{categories}”)
该解决方案模仿了数据库中索引的概念,在数据库中,您花费时间创建数据库(将
单词
字典转换为
索引
字典)和存储该索引的内存,以便在使用哈希算法查找单词时具有非常快的分辨率(在恒定时间内查找钥匙)


上述解决方案的一个好处是,如果一个单词分为两个类别,您将得到您的单词所属的所有类别的列表。

另一种方法是转换您的输入单词以反转逻辑:将值设为键,并将键设为值

因此,解决方案如下:

def反转dic(索引):
新的_dic={}
对于index.items()中的k,v:
对于v中的x:
新的dic.setdefault(x,[])。追加(k)
然后你会做:

index=invert_dic(字)#线性时间,O(n)
word=输入('输入一个单词:')
categories=index.get(word,['None'])#常数时间,O(1)
print(“,”.join(f“您的单词在这些类别中:{categories}”)
该解决方案模仿了数据库中索引的概念,在数据库中,您花费时间创建数据库(将
单词
字典转换为
索引
字典)和存储该索引的内存,以便在使用哈希算法查找单词时具有非常快的分辨率(在恒定时间内查找钥匙)

上述解决方案的一个好处是,如果一个单词分为两个类别,您将得到您的单词所属的所有类别的列表