从lis中删除重复字典

2024-06-09 17:53:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我列出了具有相同键和不同值的字典,但有时可能是重复的:

[{'colorName': u'red',
  'color_thumb': [],
  'main_zoom_picture': u'webcontent/0007/991/393/cn7991393.jpg',
  'pic_uris': [(u'S', u'webcontent/0007/991/248/cn.jpg')],
  'swatch_image_path': u'webcontent/0007/991/248/cn7991248.jpg'},
 {'colorName': u'red',
  'color_thumb': [],
  'main_zoom_picture': u'webcontent/0007/991/393/cn7991393.jpg',
  'pic_uris': [(u'S', u'webcontent/0007/991/248/cn.jpg')],
  'swatch_image_path': u'webcontent/0007/991/248/cn7991248.jpg'}]

我在做:

^{pr2}$

接收:

^{3}$

Tags: imagemainredcncolorjpgpicturezoom
3条回答

这对我来说是你的数据集的诀窍。

from itertools import groupby

print [k for k,v in groupby(sorted(shared_list))]

已采取from this question

您的循环已反转;首先需要循环^{cd1>}*上:

[dict(tupleized) for item in shared_list for tupleized in set(tuple(item.items()))]

列表理解以嵌套顺序列出循环;左侧是最外层的。

下一个问题是,您的值包含列表,这些列表不能添加到未经更改的集合中。

接下来,您需要使用set外部到循环,以测试是否在之前看到字典:

^{pr2}$

这里^{cd2>}负责从每个字典生成一个不可变的元组:

^{pr3}$

排序确保即使对于具有不同键顺序的字典(可以根据字典的插入和删除历史更改)检查是否仍然有效。

并且^{cd3>}用于跟踪到目前为止已看到的副本,以筛选出任何后续重复项:

^{pr4}$

马蒂金·皮特尔斯关于你在理解清单时的错误的解释是正确的。为列表中的每个dict返回的items()将是一个列表。换句话说,集合不能散列列表列表。在

但是,可以在一个集合中存储一个元组。所以您可以对代码行进行以下更改。在

>>> [dict(tupleized) for tupleized in set([tuple(tup for tup in item.items()) for item in shared_list]

而且,克里斯托夫·黑格曼的回答非常优雅。如果你有时间和爱好,请检查一下iTerools(我最近发现的,很好用)。在

我向克里斯托夫道歉,因为我会投票给你的答案,但我最近刚成为社区成员。所以我没有代表:(

相关问题 更多 >