在python中检查字典列表中的项

2024-04-25 15:26:23 发布

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

我有一个字典列表=

a = [{"ID":1, "VALUE":2},{"ID":2, "VALUE":2},{"ID":3, "VALUE":4},...]

"ID"是每个字典的唯一标识符。考虑到这个列表是巨大的,最快的方法是什么来检查一个有特定"ID"的字典是否在列表中,如果没有附加到它?然后更新它的"VALUE""VALUE"如果dict已经在列表中,则会更新,否则会写入某个值)


Tags: 方法id列表字典value标识符dict
3条回答

将列表转换为dict,然后检查值会更有效。你知道吗

d = dict((item['ID'], item['VALUE']) for item in a)
for new_key, new_value in new_items:
    if new_key not in d:
        d[new_key] = new_value

你不会使用列表。改用字典,将ID映射到嵌套字典:

a = {
    1: {'VALUE': 2, 'foo': 'bar'},
    42: {'VALUE': 45, 'spam': 'eggs'},
}

注意,您不需要在嵌套字典中包含ID键;这样做是多余的。你知道吗

现在您只需查找是否存在密钥:

if someid in a:
    a[someid]['VALUE'] = newvalue

我确实假设您的ID键不一定是序列号。我还假设您需要存储除VALUE之外的其他信息;否则,只需将ID映射到VALUE值的扁平字典就足够了。你知道吗

字典允许您按O(1)时间(与字典大小无关的常数时间)中的键查找值。列表也允许您在固定时间内查找元素,但只有知道索引时才可以。你知道吗

如果您不需要并且必须扫描列表,那么就有一个O(N)操作,其中N是元素数。您需要查看列表中的每一个字典,看看它是否匹配ID,如果ID不存在,这意味着您必须从头到尾进行搜索。字典仍然会在一(1)分钟内告诉你钥匙不在那里。你知道吗

如果可以,请按照其他答案的建议转换为字典,但如果您有理由*不更改存储项目的数据结构,请执行以下操作:

items = [{"ID":1, "VALUE":2}, {"ID":2, "VALUE":2}, {"ID":3, "VALUE":4}]

def set_value_by_id(id, value):
    # Try to find the item, if it exists
    for item in items:
        if item["ID"] == id:
            break

    # Make and append the item if it doesn't exist
    else:  # Here, `else` means "if the loop terminated not via break"
        item = {"ID": id}
        items.append(id)

    # In either case, set the value
    item["VALUE"] = value

*我能想到的一些合理的理由包括保留项目的顺序和允许具有相同id的重复项目。有关使词典能够满足这些要求的方法,您可能想看看OrderedDictthis answer about duplicate keys。你知道吗

相关问题 更多 >