Python 浏览列表的最快方式。如果x在列表中,则检索列表中有x的元素

Python 浏览列表的最快方式。如果x在列表中,则检索列表中有x的元素,python,Python,如果我有一份清单,例如 [{'id': '129', 'label': 'UK 9 (Out of Stock)', 'price': '0', 'oldPrice': '0', 'products': ['105514', False, '0'], 'disabled': 'disabled'}, {'id': '130', 'label': 'UK 9½', 'price': '0', 'oldPrice': '0', 'products': ['105515', True, '0'], '

如果我有一份清单,例如

[{'id': '129', 'label': 'UK 9 (Out of Stock)', 'price': '0', 'oldPrice': '0', 'products': ['105514', False, '0'], 'disabled': 'disabled'},
{'id': '130', 'label': 'UK 9½', 'price': '0', 'oldPrice': '0', 'products': ['105515', True, '0'], 'disabled': ''},
{'id': '131', 'label': 'UK 10 (Out of Stock)', 'price': '0', 'oldPrice': '0', 'products': ['105516', False, '0'], 'disabled': 'disabled'}]
要获取列表中的元素,请使用“未禁用”或“true”等

我想知道如果我有一个很长的列表,最快的方法是什么

感谢您的回答。

列表本质上是一个用于查找的O(n)结构;如果你需要找到一些东西,你只需浏览列表,直到找到为止

在您的情况下,
id
值似乎是唯一的。如果是这种情况,您可以通过稍微修改数据结构使访问时间为O(1):

{
  '129': {'label': 'UK 9 (Out of Stock)', 'price': '0', 'oldPrice': '0', 'products': ['105514', False, '0'], 'disabled': 'disabled'},
  '130': {'label': 'UK 9½', 'price': '0', 'oldPrice': '0', 'products': ['105515', True, '0'], 'disabled': ''},
  '131': {'label': 'UK 10 (Out of Stock)', 'price': '0', 'oldPrice': '0', 'products': ['105516', False, '0'], 'disabled': 'disabled'}
}
这会将最外层的集合转换为字典,并键入各个项的ID。对于大量项目,如果您直接使用键(例如
d['129']
)访问项目,那么这将比使用
[]
列表的访问时间快得多。如果您使用类似于
d.keys()
的方法扫描它,您又回到了O(n)


如果绝对需要能够使用多个元素选择此字典的成员进行访问,则可能需要构建自定义数据结构()。这是否值得,实际上取决于有多大。如果您有几千条记录,只需坚持使用列表,您将不会注意到差异(并且使用定制的解决方案可能会更慢)。如果你有几百万,那么开始寻找优化的方法。

你可以把它放在一个数据帧中,与for循环相比,不确定它的速度

import pandas as pd
data = {
  '129': {'label': 'UK 9 (Out of Stock)', 'price': '0', 'oldPrice': '0', 'products': ['105514', False, '0'], 'disabled': 'disabled'},
  '130': {'label': 'UK 9½', 'price': '0', 'oldPrice': '0', 'products': ['105515', True, '0'], 'disabled': ''},
  '131': {'label': 'UK 10 (Out of Stock)', 'price': '0', 'oldPrice': '0', 'products': ['105516', False, '0'], 'disabled': 'disabled'}
}

df = pd.DataFrame(data)

df[df.disabled!=''].to_dict(orient='records')
输出:

[{'id': '129',
  'label': 'UK 9 (Out of Stock)',
  'price': '0',
  'oldPrice': '0',
  'products': ['105514', False, '0'],
  'disabled': 'disabled'},
 {'id': '131',
  'label': 'UK 10 (Out of Stock)',
  'price': '0',
  'oldPrice': '0',
  'products': ['105516', False, '0'],
  'disabled': 'disabled'}]```
在这种情况下,即使您进入“组装级别”,您也必须检查列表中的每个元素是否符合所需的条件

唯一可能的加速方法是记录元素的数量

“带但不带禁用或带true等”


当您创建列表时,您只需直接进入这些元素并添加,但老实说,您无法避免对列表进行迭代,如果您不这样做,计算机内部将进行迭代。

下面是与时间估计的比较。我使用了
列表理解
熊猫数据帧
。一旦将数据作为数据帧加载进来,数据帧方法会更快。但是,如果你考虑数据中的加载,显然是列表理解出现在<强>优胜者< /强>。 我列出了100万本字典,每本都和你们的结构相似

注意

CPU times: user 178 ms, sys: 0 ns, total: 178 ms
Wall time: 184 ms
CPU times: user 68.4 ms, sys: 6.03 ms, total: 74.4 ms
Wall time: 75.6 ms
CPU times: user 1.2 s, sys: 49.5 ms, total: 1.25 s
Wall time: 1.26 s
  • 这项测试是在带有两个CPU的google colab笔记本上进行的。操作系统:Ubuntu Linux
  • 此外,我还修改了代码,以帮助使用
    val.get('id')
    检查输出,而不是使用所需的
    val.get('disabled')
制作虚拟数据
将numpy导入为np
作为pd进口熊猫
def make_dict(id=0,disabled=True):
dis=“禁用”如果禁用,则为“禁用”,否则为“”
d={'id':id,'label':'UK 9½','price':'0','oldPrice':'0','products':['105515',True,'0'],'disabled':dis}
返回d
def制造列表(大小=10,种子=0):
np.random.seed(seed=seed)
状态=(np.random.rand(大小)>0.5)
ids=np.arange(尺寸)+1
VAL=[id为make_dict(id=id,disabled=disabled),zip为disabled(id,status)]
返回VAL
VAL=制作列表(大小=1000000,种子=0)
df=pd.数据帧(VAL)
1.测试列表理解(最佳选项:最快)
%%次
如果val.get('disabled')='',则val中val的id=[val.get('id')表示val
输出

CPU times: user 178 ms, sys: 0 ns, total: 178 ms
Wall time: 184 ms
CPU times: user 68.4 ms, sys: 6.03 ms, total: 74.4 ms
Wall time: 75.6 ms
CPU times: user 1.2 s, sys: 49.5 ms, total: 1.25 s
Wall time: 1.26 s
2.测试数据帧(无数据加载)

这里,我们不考虑加载数据作为数据文件所需的时间。

%%次
ids=df.loc[df['disabled']='','id'].tolist()
输出

CPU times: user 178 ms, sys: 0 ns, total: 178 ms
Wall time: 184 ms
CPU times: user 68.4 ms, sys: 6.03 ms, total: 74.4 ms
Wall time: 75.6 ms
CPU times: user 1.2 s, sys: 49.5 ms, total: 1.25 s
Wall time: 1.26 s
3.测试数据帧(带数据加载) 这里我们确实包括了将数据作为数据帧加载所需的时间

%%次
df=pd.数据帧(VAL)
ids=df.loc[df['disabled']='','id'].tolist()
输出

CPU times: user 178 ms, sys: 0 ns, total: 178 ms
Wall time: 184 ms
CPU times: user 68.4 ms, sys: 6.03 ms, total: 74.4 ms
Wall time: 75.6 ms
CPU times: user 1.2 s, sys: 49.5 ms, total: 1.25 s
Wall time: 1.26 s

你说的“有无残疾或有真实等等”是什么意思?@smac89我只想要列表中没有残疾的元素。我将对此进行投票,因为熊猫有相当快的潜力,但我对它也有点了解。。。如果使用(滥用)不当,这可能是一个真正的诅咒。@Kim看看这个比较。也许你在找这样的东西。