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})
答案 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)])