首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于键的唯一字典列表

基于键的唯一字典列表
EN

Stack Overflow用户
提问于 2010-12-07 04:31:03
回答 10查看 9.9K关注 0票数 5

我有一份dics的列表:

代码语言:javascript
复制
     data = {}
     data['key'] = pointer_key
     data['timestamp'] = timestamp
     data['action'] = action
     data['type'] = type
     data['id'] = id

     list = [data1, data2, data3, ... ]

如何确保对于列表中的每个数据项,每个“键”只有一个这样的元素?如果有如下所示的两个密钥,则最新的时间戳将取胜:

代码语言:javascript
复制
    list = [{'key':1,'timestamp':1234567890,'action':'like','type':'photo',id:245},
            {'key':2,'timestamp':2345678901,'action':'like','type':'photo',id:252},
            {'key':1,'timestamp':3456789012,'action':'like','type':'photo',id:212}]

    unique(list)

    list = [{'key':2,'timestamp':2345678901,'action':'like','type':'photo',id:252},
            {'key':1,'timestamp':3456789012,'action':'like','type':'photo',id:212}]

谢谢。

EN

回答 10

Stack Overflow用户

发布于 2012-12-09 03:12:47

这是我的解决方案:

代码语言:javascript
复制
def uniq(list_dicts):
    return [dict(p) for p in set(tuple(i.items()) 
        for i in list_dicts)]

希望它能帮助到一些人。

票数 5
EN

Stack Overflow用户

发布于 2013-11-09 05:07:04

我需要这个,但我不喜欢这里的任何答案。所以我做了这个简单而高效的版本。

代码语言:javascript
复制
def list_of_seq_unique_by_key(seq, key):
    seen = set()
    seen_add = seen.add
    return [x for x in seq if x[key] not in seen and not seen_add(x[key])]

# Usage
# If you want most recent timestamp to win, just sort by timestamp first
list = sorted(list, key=lambda k: k['timestamp'], reverse=True)
# Remove everything with a duplicate value for key 'key'
list = list_of_seq_unique_by_key(list, 'key')
票数 4
EN

Stack Overflow用户

发布于 2010-12-07 04:42:26

需要说明的是,您有多个字典,但是您想要一个唯一的数据“密钥”?例如,如果data1'key‘= 'hello’,您想确保不允许data2'key‘= 'hello’?您希望它只引发一个错误吗?这是一种验证它是否正常的方法。(同样,将列表命名为' list‘也不太好,因为列表是python中的一种数据类型)

代码语言:javascript
复制
datalist = [datadict1, datadict2, datadict3]
big_key_list = []
for datadict in datalist:
    curkey = datadict.get('key')
    if curkey not in big_key_list:
        big_key_list.append(curkey)
    else:
        raise Exception("Key %s in two data dicts" % curkey)

现在,更好的方法是创建一个继承自dict的新类,该类包含子字典,但不允许多个键具有相同的值。这样,错误就会在赋值时抛出,而不是你可以只检查事情是否正常(如果事情不好,除了引发错误之外,你不知道该怎么办)。

编辑:实际上,在查看您可能要做的事情时,您的数据设置不正确。我这么说是因为您似乎希望每个词条都有一个单独的字典。这几乎可以肯定是一种不优雅的方式。

首先创建一个类:

代码语言:javascript
复制
class MyDataObject(object):
    def __init__(self, **kwargs):
        for k,v in kwargs:
            self.__dict__[k] = v

或者,如果它们将始终具有所有4个固定参数:

代码语言:javascript
复制
class MyDataObject(object):
    def __init__(self, timestamp, action, obj_type, obj_id):
        self.timestamp = timestamp
        self.action = action
        self.type = obj_type
        self.id = obj_id

然后只需定义您的数据类型。

代码语言:javascript
复制
data = {}
data['key1'] = MyDataObject(timestamp='some timestamp', action='some action', type='some type', id = 1234)
data['key2'] = MyDataObject(timestamp='some timestamp2', action='some action2', type='some type2', id = 1235)

你可以像这样访问你的数据:

代码语言:javascript
复制
data['key1'].timestamp # returns 'some timestamp'
data['key2'].action # returns 'some action2'

或者你甚至可以使用dict()来访问(例如,如果你有一个变量x='action‘并且你想要访问它,这是很有帮助的)。

代码语言:javascript
复制
data['key1'].__dict__('action') # returns 'some action'
data['key2'].__dict__('timestamp') # returns 'some timestamp2'

现在您只有一个对象字典,其中键是惟一的,并且与键关联的数据作为一个对象保存(类型为MyDataObject)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4370660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档