从 python 列表中删除重复的 JSON 对象

新手上路,请多包涵

我有一个字典列表,其中某个特定值重复多次,我想删除重复值。

我的清单:

 te = [
      {
        "Name": "Bala",
        "phone": "None"
      },
      {
        "Name": "Bala",
        "phone": "None"
      },
      {
        "Name": "Bala",
        "phone": "None"
      },
      {
        "Name": "Bala",
        "phone": "None"
      }
    ]

删除重复值的函数:

 def removeduplicate(it):
    seen = set()
    for x in it:
        if x not in seen:
            yield x
            seen.add(x)

当我调用此函数时,我得到 generator object

 <generator object removeduplicate at 0x0170B6E8>

当我尝试遍历生成器时,我得到 TypeError: unhashable type: 'dict'

有没有办法删除重复值或迭代生成器

原文由 Tony Roczz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 786
2 个回答

您可以通过字典理解轻松删除重复键,因为字典不允许重复键,如下所示 -

 te = [
      {
        "Name": "Bala",
        "phone": "None"
      },
      {
        "Name": "Bala",
        "phone": "None"
      },
      {
        "Name": "Bala",
        "phone": "None"
      },
      {
        "Name": "Bala",
        "phone": "None"
      },
      {
          "Name": "Bala1",
          "phone": "None"
      }
    ]

unique = { each['Name'] : each for each in te }.values()

print unique

输出-

 [{'phone': 'None', 'Name': 'Bala1'}, {'phone': 'None', 'Name': 'Bala'}]

原文由 SIslam 发布,翻译遵循 CC BY-SA 3.0 许可协议

因为您不能将 dict 添加到 set 。从 这个问题

您正在尝试使用 dict 作为另一个 dictset 的密钥。这不起作用,因为键必须是可哈希的。

作为一般规则,只有不可变对象(字符串、整数、浮点数、冻结集、不可变元组)是可哈希的(尽管可能有例外)。

 >>> foo = dict()
>>> bar = set()
>>> bar.add(foo)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>>

相反,您已经在使用 if x not in seen ,因此只需使用一个列表:

 >>> te = [
...       {
...         "Name": "Bala",
...         "phone": "None"
...       },
...       {
...         "Name": "Bala",
...         "phone": "None"
...       },
...       {
...         "Name": "Bala",
...         "phone": "None"
...       },
...       {
...         "Name": "Bala",
...         "phone": "None"
...       }
...     ]

>>> def removeduplicate(it):
...     seen = []
...     for x in it:
...         if x not in seen:
...             yield x
...             seen.append(x)

>>> removeduplicate(te)
<generator object removeduplicate at 0x7f3578c71ca8>

>>> list(removeduplicate(te))
[{'phone': 'None', 'Name': 'Bala'}]
>>>

原文由 Remi Guan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题