为了账号安全,请及时绑定邮箱和手机立即绑定

删除Python列表中的重复DECT

删除Python列表中的重复DECT

元芳怎么了 2019-07-11 20:46:45
删除Python列表中的重复DECT我有一个字典列表,我想用相同的键和值对删除这些数据集。关于这份清单:[{'a': 123}, {'b': 123}, {'a': 123}]我想退货:[{'a': 123}, {'b': 123}]另一个例子:关于这份清单:[{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}, {'a': 123, 'b': 1234}]我想退货:[{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}]
查看完整描述

3 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

试试这个:

[dict(t) for t in {tuple(d.items()) for d in l}]

策略是将字典列表转换为元组列表,其中元组包含字典的项。由于元组可以被散列,所以可以使用set(使用集合理解在这里,更老的python替代方案应该是set(tuple(d.items()) for d in l)),在此之后,从元组重新创建字典。dict.

其中:

  • l

    是原始列表
  • d

    是列表中的字典之一。
  • t

    是从字典中创建的元组之一。

编辑:如果您想保留顺序,上面的一行将无法工作,因为set不会那么做的。但是,使用几行代码,您也可以这样做:

l = [{'a': 123, 'b': 1234},
        {'a': 3222, 'b': 1234},
        {'a': 123, 'b': 1234}]seen = set()new_l = []for d in l:
    t = tuple(d.items())
    if t not in seen:
        seen.add(t)
        new_l.append(d)print new_l

示例输出:

[{'a': 123, 'b': 1234}, {'a': 3222, 'b': 1234}]

注意:可能会出现两个键和值相同的字典,不会产生相同的元组。如果它们经历不同的添加/删除键历史记录,则可能发生这种情况。如果您的问题是这样的,那么考虑排序d.items()正如他所建议的。


查看完整回答
反对 回复 2019-07-11
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

另一条-基于清单理解的班轮:

>>> d = [{'a': 123}, {'b': 123}, {'a': 123}]>>> [i for n, i in enumerate(d) if i not in d[n + 1:]][{'b': 123}, {'a': 123}]

既然我们可以用dict比较而言,我们只保留未在初始列表的其余部分中的元素(此概念仅可通过索引访问)。n,因此使用了enumerate).


查看完整回答
反对 回复 2019-07-11
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

有时旧的循环仍然很有用。这段代码略长于jcorado的代码,但很容易读懂:

a = [{'a': 123}, {'b': 123}, {'a': 123}]b = []for i in range(0, len(a)):
    if a[i] not in a[i+1:]:
        b.append(a[i])


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 525 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信