Как создать словарь сопоставления с набором значений, чтобы избежать идентичных ключей в диктовке - PullRequest
0 голосов
/ 06 мая 2018

У меня есть следующий словарь, который отображает слово на частоту, с которой это слово появляется в тексте:

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

слова «любит» и «кодирование» встречаются в тексте 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 голосов
/ 06 мая 2018

Как и в ответе @ 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}
0 голосов
/ 06 мая 2018

Прежде всего

слова 'loves' и 'coding' встречаются в тексте 3 раза и поэтому имеют одинаковый ключ.

они на самом деле имеют одинаковое значение , а не один и тот же ключ (может, вы его опечатали?).

Но вы можете просто сделать простой for -loop, а затем простую логику, где вы сначала проверяете, существует ли значение в вашем новом dict; это делает, добавить к их стоимости; если это не так, создайте новую запись.

d = {'loves' : 3, 'coding' : 3} 
new_dict = {}

for key, value in d.items():
    if new_dict.get(value, None):
        new_dict[value].add(key)
    else:
        new_dict[value] = {key}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...