【问题标题】:Check if list of dictionaries are unique based on a property根据属性检查字典列表是否唯一
【发布时间】:2019-01-12 00:22:28
【问题描述】:

python 标准库中是否有一个函数可以根据字典属性之一检查列表是否唯一?

类似这样的:

is_unique(dict_list, prop="x")

结果:

{"x": 1, "y": 2}, {"x": 2, "y": 2}, {"x": 2, "y": 3}  <- False
{"x": 1, "y": 2}, {"x": 2, "y": 2}, {"x": 3, "y": 3}  <- True

【问题讨论】:

  • 你知道 prop 会在所有的字典中吗?
  • 是的,它在所有的字典中
  • “最佳” 依据什么标准?你目前的实现是什么,你认为它的问题是什么?
  • 好吧不一定是最好的......如果python已经有一个,我不想自己写

标签: python dictionary properties unique


【解决方案1】:

或者:

def is_unique(lod, prop):
    seen=set()
    return not any(i[prop] in seen or seen.add(i[prop]) for i in lod)
LOD=[{"x": 1, "y": 2}, {"x": 2, "y": 2}, {"x": 2, "y": 3}]
print(is_unique(LOD,'x'))

输出:

False

【讨论】:

  • 您应该将该列表理解设为生成器:any(i in seen or seen.add(i) for i in (i[prop] for i in lod))。否则,您将迭代您的解决方案试图避免的整个列表。
  • @schwobaseggl 编辑了我的答案
  • 或者只是:any(i[prop] in seen or seen.add(i[prop]) for i in lod) 更短且无害,因为键查找是 O(1)
  • @schwobaseggl 再次感谢
【解决方案2】:

你可以天真地做:

def is_unique(dcts, prop):
    return len(dcts) == len(set(d[prop] for d in dcts))

这假设值d[prop] 是可散列的。如果您有很长的列表,您可能希望在构建道具集时尽早中断(遇到第一个重复项时),就像这样做一样 U9-Forward 的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2018-03-20
    • 1970-01-01
    • 2021-01-19
    • 2013-09-07
    • 1970-01-01
    • 2017-09-28
    相关资源
    最近更新 更多