我正在使用非规范化表,这在提取唯一信息时提供了一些挑战。如果表格被标准化:
unique_data = list({d['value'] for d in mydata})
会成功的。
但是表格没有标准化。
我可以创建一组 dict 然后我可以变成列表吗?类似的东西(这给了我一个错误):
unique_data_with_id = list({{'id':d['id'], 'value':d['value']} for d in mydata})
我正在使用非规范化表,这在提取唯一信息时提供了一些挑战。如果表格被标准化:
unique_data = list({d['value'] for d in mydata})
会成功的。
但是表格没有标准化。
我可以创建一组 dict 然后我可以变成列表吗?类似的东西(这给了我一个错误):
unique_data_with_id = list({{'id':d['id'], 'value':d['value']} for d in mydata})
字典是可变的,所以你不能把它们放在一个集合中。解决此问题的一种方法是使用 anamedtuple
而不是字典:
IdValueTuple = collections.namedtuple("IdValueTuple", "id value")
unique_data_with_id = list({IdValueTuple(d["id"], d["value"]) for d in mydata})
{{'id':d['id'], 'value':d['value']} for d in mydata}
创建一个set
s dict
。因为dict
s 是可变的,所以它们不是可散列的,并且集合需要可散列的元素。
请尝试tuple
:
{(d['id'], d['value']) for d in mydata}
请注意,我非常喜欢 Sven Marnach 在namedtuple
这里使用的 a。
更多因为它在其他上下文中偶尔有用,您可以使用 afrozenset
作为中间对象:
>>> pprint.pprint(mydata)
[{'id': 1, 'ignore': 92, 'value': 'a'},
{'id': 2, 'ignore': 92, 'value': 'b'},
{'id': 1, 'ignore': 92, 'value': 'a'}]
>>> keep_keys = "id", "value"
>>> [dict(s) for s in {frozenset((k, d[k]) for k in keep_keys) for d in mydata}]
[{'id': 1, 'value': 'a'}, {'id': 2, 'value': 'b'}]