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}”)
该解决方案模仿了数据库中索引的概念,在数据库中,您花费时间创建数据库(将单词
字典转换为索引
字典)和存储该索引的内存,以便在使用哈希算法查找单词时具有非常快的分辨率(在恒定时间内查找钥匙)
上述解决方案的一个好处是,如果一个单词分为两个类别,您将得到您的单词所属的所有类别的列表