Найти - Пользователи
Полная версия: Добавить элементы в словарь, которые еще не встречались в нем
Начало » Python для новичков » Добавить элементы в словарь, которые еще не встречались в нем
1
Relrin
Нужно проверить на соответствие 2 словаря. В словарь functions копируется те элементы, которые еще не встречались в functions, но есть в funcDefine. Но возникает ошибка KeyError ‘2’, когда я хочу создать новое значение с заданным ключом. Быть может кто знает как решить эту проблему?
    file.seek(0)
    for line in file.readlines():
        string=line.replace('\n','')
        fncInRuby=RubyFunctions(string,cnt)
        # если полученный словарь не пустой, то просмотрим его
        if fncInRuby.funcDefine!={}:
            for key_new in fncInRuby.funcDefine.keys():
                NeedSave=1
                if functions!={}:
                    for key_old in functions.keys():
                        if functions[key_old]==fncInRuby.funcDefine[key_new]:
                            NeedSave=0
                            break
                if NeedSave==1: functions[key_new]=fncInRuby.funcDefine[key_new]  # тут ошибку KeyError '2' показывает
Viktor_Zorichev
Метод update не подойдет? Обратите внимание, что значения с одинаковыми ключами перезаписываются.
functions = {1: 'a', 2: 'b', 3: 'c'}
print functions
funcDefine = {1: 'aa', 2: 'b', 4: 'd'}
print funcDefine
functions.update(funcDefine)
print functions

{1: 'a', 2: 'b', 3: 'c'}
{1: 'aa', 2: 'b', 4: 'd'}
{1: 'aa', 2: 'b', 3: 'c', 4: 'd'}
Relrin
Viktor_Zorichev
functions = {1: ‘a’, 2: ‘b’, 3: ‘c’}
print functions
funcDefine = {1: ‘aa’, 2: ‘b’, 4: ‘d’}
print funcDefine
functions.update(funcDefine)
print functions
Да, спасибо. Учту этот момент.
Довел вот до такого типа:
    for key_b in buf.keys():
        cnt=0
        tmp={}
        NoKey=False
        # считаем количество повторов
        for key in buf.keys():
            if buf==buf: cnt+=1
        # смотрим в исходный словарь, чтобы было без повторов
        if functions!={}:
            for key in functions.keys():
                if functions!=buf: NoKey=True
                else: NoKey=False
        # запись в словарь
        tmp[key_b]=[buf[key_b],cnt]
        if functions=={} or NoKey: functions.update(tmp)
Единственное, что мне непонятно, так это почему все равно ключи, которые не должны попадать еще раз в словарь, туда попадают?

Один из примеров вывода:
new использовался 2 раз(а)
new использовался 2 раз(а)
add использовался 8 раз(а)
add использовался 8 раз(а)
add использовался 8 раз(а)
add использовался 8 раз(а)
add использовался 8 раз(а)
add использовался 8 раз(а)
add использовался 8 раз(а)
add использовался 8 раз(а)
menu использовался 1 раз(а)
Relrin
Решил проблему, сделав так:
def CorrectDict(buf):
    """
        Корректируем словарь до вида КЛЮЧ:["объект","кол-во повторов"], с исключением повторяющихся элементов
        Входные данные:
            buf        - данные присланные от обработчиков строк в виде словаря
    """
    base={}
    ListInDict={}
    for key_b in buf.keys():
        cnt=0
        # считаем количество повторов
        for key in buf.keys():
            if buf[key_b]==buf[key]: cnt+=1
        # запись в словарь
        ListInDict[key_b]=[buf[key_b],cnt]
    
    keys=values=[]
    for key in buf.keys():
        temp={}
        if (key not in keys) and (ListInDict[key] not in values):
            temp[key]=ListInDict[key]
            base.update(temp)
            keys.append(key)
            values.append(ListInDict[key])
    return base
py.user.next
>>> funcdict = {1: 'a', 2: 'b', 3: 'c'}
>>> funcdefdict = {1: 'aa', 2: 'b', 4: 'd'}
>>> 
>>> funcdict.update(i for i in funcdefdict.items()
...                 if i[0] not in funcdict)
>>> 
>>> funcdict
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
>>>
это без замен
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB