Нахождение заданной разницы между двумя сложными словарями - PullRequest
2 голосов
/ 31 августа 2009

У меня есть два словаря следующей структуры:

a) dict1 = {'a':[ [1,2], [3,4] ], 'b':[ [1,2],[5,6] ]}
b) dict2 = {'a':[ [1,2], [5,6] ], 'b':[ [1,2],[7,8] ]}

Мне нужно найти разность наборов между каждым ключом в словаре, то есть dict1 ['a'] - dict2 ['a'] должен вернуть [3,4]. Любая мысль приветствуется.

Ответы [ 4 ]

6 голосов
/ 31 августа 2009

Использование изменяемых элементов (таких как списки) значительно усложняет задачу, поскольку исключает простое использование структуры данных Python set. Возможно, стоит сделать временные копии / версии, которые фактически используют кортежи вместо этих надоедливых списков:

def tempaux(d):
  return dict((k, set(tuple(x) for x in v))
              for k, v in d.iteritems())

Сейчас:

def thedifs(dd1, dd2)
  d1 = tempaux(dd1)
  d2 = tempaux(dd2)
  allkeys = set(d1).update(d2)
  empty = set()
  difs = []
  for k in allkeys:
    s1 = d1.get(k, empty)
    s2 = d2.get(k, empty)
    adif = s1 - s2
    if adif: difs.append(adif)
  return difs

Это предполагает фактическую разность наборов, а не симметричную разность и т. Д. Конечно, вы можете превратить кортежи в списки до возвратов и т. Д., В зависимости от ваших точных требований.

3 голосов
/ 31 августа 2009
>>> s1 = set([(1,2), (3,4)])
>>> s2 = set([(1,2), (5,6)])
>>> s1 - s2
{(3, 4)}
2 голосов
/ 09 октября 2012

применимо к списку, диктату или номеру, когда a и b имеют одинаковую структуру

c={'a':'1','b':'2'}
d={'a':'10','b':'20'}
e={'x':c,'t':15}
f={'x':d,'t':19}

def diff(a,b):
    if isinstance(a, int) and isinstance(b, int):
        b = b - a
        return b
    if isinstance(a, str) and isinstance(b, str):
        if a.isdigit() and b.isdigit():
            b = str(int(b) - int(a))
            return b
        else:
            b = a
            return b
    if type(a) is list and type(b) is list:
        for i in range(len(a)):
            b[i] = diff(a[i],b[i])
        return b
    if type(a) is dict and type(b) is dict:
        for k,v in b.iteritems():
            b[k] = diff(a[k],b[k])
        return b

print diff(e,f)
2 голосов
/ 31 августа 2009

У вас неправильная структура данных для того, что вы пытаетесь сделать.

Используйте это вместо.

dict1 = {'a': [(1, 2), (3, 4)], 'b': [(1, 2), (5, 6)]}
dict2 = {'a': [(1, 2), (5, 6)], 'b': [(1, 2), (7, 8)]}

Жизнь проще, когда вы пытаетесь выполнять операции над множествами неизменяемых объектов, таких как кортежи.

Это преобразует ваш список списков в список списков.

>>> dict( (key,[tuple(v) for v in dict1[key]]) for key in dict1 )
{'a': [(1, 2), (3, 4)], 'b': [(1, 2), (5, 6)]}

Вот полное решение.

>>> dict1t= dict( (key,[tuple(v) for v in dict1[key]]) for key in dict1 )
>>> dict2t= dict( (key,[tuple(v) for v in dict2[key]]) for key in dict2 )
>>> set(dict1t['a'])-set(dict2t['a'])
set([(3, 4)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...