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

2024-09-22 16:39:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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']

我检查了问题Get key by value in dictionary,但所有答案都适用于每个键有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子句。如果我想更改一个类别的名称或它们的顺序,删除一个,合并两个或更多,等等,我必须手工调整一大堆东西

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

感谢所有的帮助


Tags: keyininputindex字典类别wordwords
3条回答

您可以将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')}

def find_cat(word):
    for category, items in words.items():
        if word in items:
            return category

word=input('Enter a word: ')

print(find_cat(word))

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

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

>>> {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'}

然后在倒排的dict中查找您的输入

相关问题 更多 >