Есть ли способ сделать значение словаря эквивалентным элементу set в python? - PullRequest
3 голосов
/ 18 марта 2020

Я новичок в Python и использую Python 3.7. Итак, я пытаюсь сделать значение моего словаря равным установленному, т.е. dictionaryNew[kId] = setItem. Поэтому в основном я хочу, чтобы каждый kId (ключ) имел соответствующую строку набора в качестве значения. Я использую set , потому что Мне не нужны дублирующиеся значения в строке.

Это фрагмент из моего кода ниже:

setItem = set()
dictionaryNew = {}

for kId, kVals in dictionaryObj.items():
    for index in kVals:   
        if (index is not None):
            yourVal = 0
            yourVal = yourVal + int(index[10])
            setItem.add(str(yourVal))
            print(setItem) #the output for this is correct

    dictionaryNew[kId] = setItem
    setItem.clear()

print(dictionaryNew)

Когда я печатаю setItem, результат печатается правильно.

Вывод setItem:

{'658', '766', '483', '262', '365', '779', '608', '324', '810', '701', '208'}

Но когда я печатаю dictionaryNew, результат будет такой, как показано ниже.

Вывод dictionaryNew:

{'12': set(), '13': set(), '17': set(), '15': set(), '18': set(), '10': set(), '11': set(), '14': set(), '16': set(), '19': set()}

Я не хочу, чтобы вывод был таким. Вместо этого я хочу, чтобы в словаре была строка набора со своими значениями. Но это просто печать пустого набора, когда я пытаюсь напечатать dictionaryNew. Так что я должен сделать, чтобы решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Вы все время используете один и тот же экземпляр setItem, если вы удалите setItem.clear(), вы увидите, что каждый ключ указывает на одно и то же значение.

Вы можете создать новый set() в каждая итерация

dictionaryNew = {}
for kId, kVals in dictionaryObj.items():
    setItem = set()
    for index in kVals:   
        if index is not None:
            setItem.add(str(int(index[10]))) # the temp sum with 0 is useless

    dictionaryNew[kId] = setItem

При использовании dict-понимания это эквивалентно

dictionaryNew = {
    kId: {str(int(index[10])) for index in kVals if index is not None}
    for kId, kVals in dictionaryObj.items()
}
1 голос
/ 18 марта 2020

вы удаляете все элементы из вашего set в этой строке setItem.clear()

вы можете использовать словарное понимание, чтобы преобразовать элементы списка в набор:

dictionaryObj = {k: set(v) for k, v in dictionaryObj.items()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...