我正在使用python 3.x,
我有2个词典(两者都非常大但会在这里替代)。词典的值包含多个单词:
dict_a = {'key1': 'Large left panel', 'key2': 'Orange bear rug', 'key3': 'Luxo jr. lamp'}
dict_a
{'key1': 'Large left panel',
'key2': 'Orange bear rug',
'key3': 'Luxo jr. lamp'}
dict_b = {'keyX': 'titanium panel', 'keyY': 'orange Ball and chain', 'keyZ': 'large bear musket'}
dict_b
{'keyX': 'titanium panel',
'keyY': 'orange Ball and chain',
'keyZ': 'large bear musket'}
我正在寻找一种方法来将dict_a
的值中包含的单个单词与dict_b
的值中包含的单词进行比较,并返回包含单词的字典或数据框,以及来自dict_a
和dict_b
的密钥与:
我想要的输出(没有以某种方式格式化):
我有一些代码可以在单个字典中查找特定单词,但这还不足以满足我在这里需要完成的任务:
def search(myDict, lookup):
aDict = {}
for key, value in myDict.items():
for v in value:
if lookup in v:
aDict[key] = value
return aDict
print (key, value)
答案 0 :(得分:1)
dicts = {'a': {'key1': 'Large left panel', 'key2': 'Orange bear rug',
'key3': 'Luxo jr. lamp'},
'b': {'keyX': 'titanium panel', 'keyY': 'orange Ball and chain',
'keyZ': 'large bear musket'} }
from collections import defaultdict
index = defaultdict(list)
for dname, d in dicts.items():
for key, words in d.items():
for word in words.lower().split(): # lower() to make Orange/orange match
index[word].append((dname, key))
index
现在包含:
{'and' : [('b', 'keyY')],
'ball' : [('b', 'keyY')],
'bear' : [('a', 'key2'), ('b', 'keyZ')],
'chain' : [('b', 'keyY')],
'jr.' : [('a', 'key3')],
'lamp' : [('a', 'key3')],
'large' : [('a', 'key1'), ('b', 'keyZ')],
'left' : [('a', 'key1')],
'luxo' : [('a', 'key3')],
'musket' : [('b', 'keyZ')],
'orange' : [('a', 'key2'), ('b', 'keyY')],
'panel' : [('a', 'key1'), ('b', 'keyX')],
'rug' : [('a', 'key2')],
'titanium': [('b', 'keyX')] }
由于您的实际字典是从字符串到列表的映射(而不是字符串到字符串),因此将循环更改为
for dname, d in dicts.items():
for key, wordlist in d.items(): # changed "words" to "wordlist"
for words in wordlist: # added extra loop to iterate over wordlist
for word in words.split(): # removed .lower() since text is always uppercase
index[word].append((dname, key))
由于您的列表只有一个项目,您可以这样做
for dname, d in dicts.items():
for key, wordlist in d.items():
for word in wordlist[0].split(): # assumes single item list
index[word].append((dname, key))
如果您有不希望添加到索引中的字词,可以跳过将它们添加到index
:
words_to_skip = {'-', ';', '/', 'AND', 'TO', 'UP', 'WITH', ''}
然后用
过滤掉它们if word in words_to_skip:
continue
我注意到你有一些用括号括起来的单词(例如(342)
和(221)
)。如果你想摆脱括号做
if word[0] == '(' and word[-1] == ')':
word = word[1:-1]
把这一切放在一起我们得到了
words_to_skip = {'-', ';', '/', 'AND', 'TO', 'UP', 'WITH', ''}
for dname, d in dicts.items():
for key, wordlist in d.items():
for word in wordlist[0].split(): # assumes single item list
if word[0] == '(' and word[-1] == ')':
word = word[1:-1] # remove outer parenthesis
if word in words_to_skip: # skip unwanted words
continue
index[word].append((dname, key))
答案 1 :(得分:1)
我认为你可以很容易地做你想做的事。此代码以{word: {key: name_of_dict_the_key_is_in}}
:
def search(**dicts):
result = {}
for name, dct in dicts.items():
for key, value in dct.items():
for word in value.split():
result.setdefault(word, {})[key] = name
return result
您可以使用输入词典作为关键字参数来调用它。您为每个字典使用的关键字将是用于在输出字典中描述它的字符串,因此请使用search(dict_a=dict_a, dict_b=dict_b)
之类的内容。
如果您的词典可能有一些相同的键,则此代码可能无法正常工作,因为如果键的值中包含相同的单词,则键可能会发生冲突。我猜你可以让外部字典包含(key, name)
元组的列表,而不是内部字典。只需将作业行更改为result.setdefault(word, []).append((key, name))
即可。尽管如此,搜索也不那么方便了。