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

У меня есть несколько словарей, которые совместно используют ключи, например,

dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'a' : -1, 'b' : -3, 'c' : 3}

Я хотел бы выполнить условную операцию для обоих, но изменить только значения ключей, которые удовлетворяют условию.Например, я хотел бы добавить 10 к любому ключу 'b', который имеет отрицательное значение, которое привело бы к:

dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'a' : -1, 'b' : 7, 'c' : 3}

Есть ли способ перебрать "ключи", которые являются общими для словаря и толькоработать на тех?например,

dicts = [dict1, dict2]

for i in dicts:
    if i['b'] < 0:
        i['b'] = i['b'] + 10

, но это дает интересный результат:

print dicts[0]
print dicts[1]

{'a': 1, 'c': -1, 'b': 12}
{'a': -1, 'c': 3, 'b': -3}

Что я не уверен, что понимаю.

У меня много (1000 с) парструктура такого типа, которая генерируется в цикле, поэтому я хотел бы, чтобы она была достаточно эффективной, если это возможно.

Спасибо!

edit:

Принятое решение

for key in set(dict1).intersection(set(dict2)):
  for i in dicts:
    if i[key] < 0:
      i[key] = i[key] + 10

отлично подходит для 2 диктов.Однако, если бы у меня изначально было 'n' dicts, которые были бы все похожими, например, для 4 диктов:

dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'a' : -1, 'b' : -3, 'c' : 3}
dict3 = {'a' : 1, 'b': -1, 'c' : -4}
dict4 = {'a' : 0, 'b': 5, 'c' : 2}

dicts = [dict1, dict2, dict3, dict4]

И желаемый результат (только добавление 10 ко всем отрицательным 'b') был бы:

dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'a' : -1, 'b' : 7, 'c' : 3}
dict3 = {'a' : 1, 'b': 9, 'c' : -4}
dict4 = {'a' : 0, 'b': 5, 'c' : 2}

Будет ли применяться та же самая структура цикла?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Вы можете создать на лету диктовку, содержащую пересекающиеся ключи.

for a in set([x for x in dict1 if x in dict2]):
    if dict1[a] < 0: dict1[a] += 10
    if dict2[a] < 0: dict2[a] += 10


>>> dict1
{'a': 1, 'c': 9, 'b': 2}
>>> dict2
{'a': 9, 'c': 3, 'b': 7}
>>> 

Однако для многих диктовок вы должны сделать это более читабельным способом

0 голосов
/ 08 октября 2018

Я не могу воспроизвести вашу проблему.Но поскольку вторая часть вашего вопроса касается эффективности, я предлагаю вам попробовать словарь для понимания.Алгоритм все еще имеет сложность O ( n ), но построение в цикле реализовано более эффективно:

def num_changer(d, inc=10, k='b'):
    return {k: v if (k != 'b') or (v >= 0) else v + 10 for k, v in d.items()}

dict1 = num_changer(dict1)
dict2 = num_changer(dict2)

print(dict1, dict2, sep='\n')

{'a': 1, 'b': 2, 'c': -1}
{'a': -1, 'b': 7, 'c': 3}
0 голосов
/ 08 октября 2018

Я не могу воспроизвести вашу проблему на Python 3. Я бы предложил вам использовать set() и intersection() для сбора общих ключей:

dict1 = {'a' : 1, 'b' : 2, 'c' : -1}
dict2 = {'d' : -1, 'b' : -3, 'e' : 3}

dicts = [dict1, dict2]

for key in set(dict1).intersection(set(dict2)):
  for i in dicts:
    if i[key] < 0:
      i[key] = i[key] + 10

Выход:

{'a': 1, 'b': 2, 'c': -1}
{'d': -1, 'b': 7, 'e': 3}
...