如何从python中的数组中获取匹配的记录?

时间:2018-07-24 05:25:04

标签: python django python-3.x

我在python中有以下数组。我想检索带有ID的记录。除了通过遍历所有记录检查每个记录的id字段之外,还有其他方法可以做到这一点。有更好的方法吗?

[
    {
        'id': 'zy0Wk',
        'name': 'vendor_change_order_status.txt',
        'path': 'templates/messages/vendor_change_order_status.txt'
     },
     {
        'id': 'JTo8c',
        'name': 'vendor_change_order_status_accepted.txt',
        'path': 'templates/messages/vendor_change_order_status_accepted.txt'
     },
]

4 个答案:

答案 0 :(得分:2)

如果您只是进行一次查找,那么真的没有什么比逐条检查记录更好了。

但是,如果您要对同一数据进行很多查找,则希望将该列表转换为以id为键的字典:

lst = [
    {
        'id': 'zy0Wk',
        'name': 'vendor_change_order_status.txt',
        'path': 'templates/messages/vendor_change_order_status.txt'
     },
     {
        'id': 'JTo8c',
        'name': 'vendor_change_order_status_accepted.txt',
        'path': 'templates/messages/vendor_change_order_status_accepted.txt'
     },
]
dct = {element['id']: element for element in lst}

现在,您可以更简单地查找内容:

thingy = dct['JTo8c']

而且效率更高。在列表中查找内容需要花费线性时间-您必须将其与列表中的每个元素进行比较。在哈希表中查找内容(字典在幕后使用的内容)需要花费恒定的时间-您对它进行哈希处理,然后执行一次比较,就知道它在那里或不在那里。 1


1。这不是完全正确的,因为不同的键可以具有相等的哈希值。但是,如果每当发生太多冲突时扩展字典,最终将得到固定的固定时间成本,而Python会自动为您完成。

答案 1 :(得分:1)

您可以使用列表理解:

filtered_list = [i for i in my_list if i.get('id') == 'zy0Wk']

尽管此记录很紧凑,但它也在列表上使用了迭代。

答案 2 :(得分:1)

假设您可以修改要返回的对象,则最好将其构造为字典字典,如下所示:

my_list = {
    'zy0Wk': {
        'name': 'vendor_change_order_status.txt',
        'path': 'templates/messages/vendor_change_order_status.txt'
    },
    'JTo8c': {
        'name': 'vendor_change_order_status_accepted.txt',
        'path': 'templates/messages/vendor_change_order_status_accepted.txt'
    }
}

然后您可以通过执行以下操作来检索id的值:

>>> my_record = my_list['zy0Wk']
>>> print(my_record)
{'path': 'templates/messages/vendor_change_order_status.txt', 'name': 'vendor_change_order_status.txt'}

答案 3 :(得分:0)

如果您只需要执行一次此操作,那么答案是否定的。但是,如果您需要多次进行此操作,则可以构造字典并使用id作为键:

a = [
    {
        'id': 'zy0Wk',
        'name': 'vendor_change_order_status.txt',
        'path': 'templates/messages/vendor_change_order_status.txt'
    },
    {
        'id': 'JTo8c',
        'name': 'vendor_change_order_status_accepted.txt',
        'path': 'templates/messages/vendor_change_order_status_accepted.txt'
    },
]

d = {x["id"]:x for x in a}

print(d["zy0Wk"])
print(d["JTo8c"])