如何统一字典的冗余元组?

时间:2012-01-13 01:22:49

标签: python

t = ({'x':1}, {'x':1}, {'y':2})

我正在使用:

统一它
l = []
for i in t:
     if i not in l:
        l.append(i)

tuple(l)

给出结果({'x': 1}, {'y': 2})

还有更好的方法吗?

另一个示例输入= ({'x':1, 'y':1}, {'x':3}, {'x':1, 'y':2}, {'x':1, 'y':2}) 示例输出:({'x':1, 'y':1}, {'x':3}, {'x':1, 'y':2})

4 个答案:

答案 0 :(得分:4)

编辑:对问题进行更新时完全不同的答案:

 dict([(x.items()[0], x) for x in t]).values()

这需要每个dict并将其转换为元组。元组是可清除的,因此它可以用作字典中的键。然后构建一个dict,其中散列元组作为键,原始dict作为值。这意味着同一个dict只存储一次。然后,我们将dict中的值作为list。然后从中构建tuple

>>> t = ({'x':1, 'y':1}, {'x':3}, {'x':1, 'y':2}, {'x':1, 'y':2})
>>> tuple(dict([(x.items()[0], x) for x in t]).values())
({'y': 1, 'x': 1}, {'x': 3}, {'y': 2, 'x': 1})

答案 1 :(得分:1)

以下单行工作:

dict([i.items()[0] for i in t])

答案 2 :(得分:1)

我认为套装可能适合你所需要的一切。但是dict不满足set-hashability成员的要求,所以我们需要一个包装器。

class HashableDictWrapper(object):
      def __init__(self, di):
          self.di = di
          self._hash_key = id("".join(["%s=%s" % (k, di[k]) for k in sorted(di.iterkeys())]))

      def __hash__(self):
          return self._hash_key

      def __eq__(self, other):
          return self.__hash__()==other.__hash__()

if __name__=="__main__":
      t = ({'x':1}, {'x':1}, {'y':2})
      s = set(map(HashableDictWrapper, t))
      tuple(map(lambda a:a.di, s))

更新: 我对@monkut的回答做了一些修改:

t = ({'x':1}, {'x':1}, {'y':2})
p = map(lambda di:tuple((k,di[k]) for k in sorted(di.iterkeys())), t)
result = tuple(map(lambda x:dict(x), set(p)))

答案 3 :(得分:0)

可能需要重新考虑你需要的东西,但是为此做好了设置。

>>> t = (("x",1), ("x",1), ("y", 2))
>>> set(t)
set([('x', 1), ('y', 2)])