Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 22, 2012 14:08:55

Relrin
Зарегистрирован: 2012-09-12
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавить элементы в словарь, которые еще не встречались в нем

Нужно проверить на соответствие 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' показывает

Отредактировано Relrin (Сен. 22, 2012 14:12:51)

Офлайн

#2 Сен. 22, 2012 15:23:10

Viktor_Zorichev
Зарегистрирован: 2012-09-15
Сообщения: 14
Репутация: +  3  -
Профиль   Отправить e-mail  

Добавить элементы в словарь, которые еще не встречались в нем

Метод 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'}

Офлайн

#3 Сен. 22, 2012 16:03:34

Relrin
Зарегистрирован: 2012-09-12
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавить элементы в словарь, которые еще не встречались в нем

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 (Сен. 22, 2012 16:09:12)

Офлайн

#4 Сен. 22, 2012 17:51:04

Relrin
Зарегистрирован: 2012-09-12
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавить элементы в словарь, которые еще не встречались в нем

Решил проблему, сделав так:

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

Отредактировано Relrin (Сен. 22, 2012 17:51:17)

Офлайн

#5 Сен. 23, 2012 08:56:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Добавить элементы в словарь, которые еще не встречались в нем

>>> 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'}
>>>
это без замен



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version