比较两个词典之间的单词

时间:2017-01-18 18:18:25

标签: python-3.x dictionary

我正在使用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_adict_b的密钥与:

相关联

我想要的输出(没有以某种方式格式化):

  • bear:key2(来自dict_a),keyZ(来自dict_b)
  • Luxo:key3
  • orange:key2(来自dict_a),keyY(来自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)

2 个答案:

答案 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))即可。尽管如此,搜索也不那么方便了。