我在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'
},
]
答案 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"])