我可以使用set comprehension从更大的dict列表中创建dict列表吗?

时间:2013-09-26 17:45:39

标签: python python-2.7 dictionary set

我正在使用非规范化表格,这在提取唯一信息方面提供了一些挑战。如果表格已经标准化:

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})

3 个答案:

答案 0 :(得分:5)

字典是可变的,所以你不能把它们放在一个集合中。解决此问题的一种方法是使用namedtuple而不是字典:

IdValueTuple = collections.namedtuple("IdValueTuple", "id value")
unique_data_with_id = list({IdValueTuple(d["id"], d["value"]) for d in mydata})

答案 1 :(得分:0)

{{'id':d['id'], 'value':d['value']} for d in mydata}

创建setdict。因为dict是可变的,所以它们不可清除,并且集合需要可清除元素。

请尝试tuple

{(d['id'], d['value']) for d in mydata}

请注意,我非常喜欢Sven Marnach在这里使用namedtuple

答案 2 :(得分:0)

更多因为它偶尔在其他上下文中有用,你可以使用frozenset作为中间对象:

>>> 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'}]