如何创建字典映射到值集以避免在dict中使用相同的键

时间:2018-05-06 03:11:43

标签: python dictionary set

我有以下字典将单词映射到该单词在文本中出现的频率:

{'loves' : 3, 'coding' : 3} 

单词'loves'和'coding'在文本中出现了3次,因此具有相同的价值。现在我们知道如果我们想在这个字典中交换键和值,它将返回:

{3:'loves'} 

或者

{3:'coding'} 

因为词典中不允许使用相同的键

现在我的问题是如何交换字典中的键和功能,同时避免重复键,如下所示:

{3: {'loves', 'coding'}} 

这是我失败的尝试:

def func(text, words): 

d = dict()

for word in text.split():
    if word in words:

        if word in d:
            d[word] += 1 

        elif word not in d:
            d[word] = 1

# return d


newDict = dict()

for key in d:
    newKey = d[key]
    newDict[newKey] = set()


    newDict[newKey].add(key)


return newDict 

编辑:

感谢您的所有宝贵答案。我还通过修复以下错误让我的工作:在错误线旁边添加注释

# swapping keys and values in a dictionary:
newDict = dict()

def func(text, words):

    d = dict()

    for word in text.split():
       if word in words:

          if word in d:
              d[word] += 1 

          elif word not in d:
             d[word] = 1

# return d


newDict = dict()

for key in d:

    if d[key] not in newDict:
        newDict[d[key]] = set({key})  # This was my bug. Initially I had 
                                      # newDict[d[key]] = set()

    elif d[key] in newDict:
        newDict[d[key]].add(key)



return newDict 

现在,如果我在以下输入上运行它:

func('Ahmed loves loves coding coding is rewarding', {'loves', 'coding', 'I'})

我得到的正是我想要的:

{2: {'coding', 'loves'}}

2 个答案:

答案 0 :(得分:1)

首先,

  

单词'loves'和'coding'在文本中出现了3次,因此具有相同的密钥。

它们实际上具有相同的,而不是相同的键(可能你错误​​输入了它?)。

但你可以做一个简单的word2vec - 循环,然后是一个简单的逻辑,你首先检查你的新for中是否存在该值;它确实如此,附加了它们的价值;如果没有,请创建一个新条目。

dict

答案 1 :(得分:0)

与@ RafaelC的回答一样,只使用集合:

d = {'loves' : 3, 'coding' : 3} 
new_dict = {}
for key, value in d.items():
    if value not in new_dict:
        new_dict[value].add(key)
    else:
        new_dict[value] = {key}