Python-唯一字典的列表,其中每个字典值都是一个列表

时间:2020-05-29 14:33:34

标签: python python-3.x list dictionary

假设我有一个这样的词典列表:

[
 {'101': ['A','B'],
  '102': ['C'],
  '103': ['D'],
  '104': [],
  '105': [],
  'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']},
 {'101': ['A'],
  '102': ['C'],
  '103': ['B'],
  '104': ['D'],
  '105': ['E'],
  'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']},
{'101': ['A','B'],
  '102': ['C'],
  '103': ['D'],
  '104': [],
  '105': [],
  'deck': ['E','F', 'G', 'H', 'I', 'J', 'K', 'L']}
]

并且我需要获得唯一字典的列表(删除重复项):

[
 {'101': ['A','B'],
  '102': ['C'],
  '103': ['D'],
  '104': [],
  '105': [],
  'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']},
 {'101': ['A'],
  '102': ['C'],
  '103': ['B'],
  '104': ['D'],
  '105': ['E'],
  'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']}
]

我尝试了

unique_solutions = list(set(val for dic in full_solutions_list for val in dic.values())) 

但是字典值的“列表”类型不可散列。

什么是有效的方法? (词典的数量相对较大)。

2 个答案:

答案 0 :(得分:1)

如果dict中没有包含list,则可以将其添加到其中(请注意,我假设您要使第三项包含'E'在其deck列表中,否则将不会重复):

x = [
 {'101': ['A','B'],
  '102': ['C'],
  '103': ['D'],
  '104': [],
  '105': [],
  'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']},
 {'101': ['A'],
  '102': ['C'],
  '103': ['B'],
  '104': ['D'],
  '105': ['E'],
  'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']},
{'101': ['A','B'],
  '102': ['C'],
  '103': ['D'],
  '104': [],
  '105': [],
  'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']}
]

unique_solutions = []
for d in x:
    if d not in unique_solutions:
        unique_solutions.append(d)

或者,您可以创建类似HashDict的类来实现哈希(在我的示例中,使用元组,但这可以通过不同的方式完成),然后创建set

class HashDict(dict):
    def __init__(self, d):
        for k, v in d.items():
            self[k] = v

    def __hash__(self):
        return hash(tuple((k, tuple(v)) for k, v in self.items()))

hdx = [HashDict(d) for d in x]
unique_solutions = list(set(hdx))

两个示例都导致

>>> print(unique_solutions)
[{'101': ['A', 'B'], '102': ['C'], '103': ['D'], '104': [], '105': [], 'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']}, {'101': ['A'], '102': ['C'], '103': ['B'], '104': ['D'], '105': ['E'], 'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']}]

答案 1 :(得分:1)

您正在尝试遍历字典值,这会导致您出错。如果该值尚不存在,可以将dict附加到列表中。

unique_solutions=[]
[unique_solutions.append(val) for val in lst if val not in unique_solutions]

结果:

>>> print(unique_solutions)
[{'101': ['A', 'B'], '102': ['C'], '103': ['D'], '104': [], '105': [], 'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']}, {'101': ['A'], '102': ['C'], '103': ['B'], '104': ['D'], '105': ['E'], 'deck': ['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']}]