Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python优化列表搜索_Python_List_Optimization - Fatal编程技术网

python优化列表搜索

python优化列表搜索,python,list,optimization,Python,List,Optimization,因此,以下面的示例列表为例 l = [ { 'post':1, 'user':1, 'other_stuff':'something', 'more':'you get the point' }, { 'post':1, 'user':2, 'other_stuff':'something', 'more':'you get the point'

因此,以下面的示例列表为例

l = [
    {
        'post':1,
        'user':1,
        'other_stuff':'something',
        'more':'you get the point'
    },
    {
        'post':1,
        'user':2,
        'other_stuff':'something',
        'more':'you get the point'
    },
    {
        'post':2,
        'user':1,
        'other_stuff':'something',
        'more':'you get the point'
    },
]
我需要能够检查
'user'
是否已经连接到
'post'
,我可以通过循环来完成:

user = 1
post = 1
response = False
for connection in l:
    if connection['post'] == post and connection['user'] == user:
        response = True
        break
这很有效。问题是在实际情况下,
l
将被填充150万次,并且每次填充时都将运行此迭代,因为它需要检查是否已经存在某些内容。因此,最后500k次迭代将遍历超过100万个字典的列表这绝对不是最有效的方法!我的问题是:什么是不需要这种排气的最佳方法


注意:我不一定知道字典中其他键的值,因此如果x在l中,我无法执行
,以检查我会重新考虑如何布置数据结构。如果您需要对<代码> POST <代码> >代码>用户<代码> >配对,我会考虑将其存储为如下格式:

l = { (1, 1) : {'other stuff':'something', ...}, 
      (1, 2) : {'other stuff':'something', ...},
      (2, 1) : {'other stuff':'something', ...} }
然后这将成为一个
O(1)
查找:

user_post_pair = (1, 1)
if user_post_pair in l:
    # Stuff...

我会重新考虑你是如何布置你的数据结构的。如果您需要对<代码> POST <代码> >代码>用户<代码> >配对,我会考虑将其存储为如下格式:

l = { (1, 1) : {'other stuff':'something', ...}, 
      (1, 2) : {'other stuff':'something', ...},
      (2, 1) : {'other stuff':'something', ...} }
然后这将成为一个
O(1)
查找:

user_post_pair = (1, 1)
if user_post_pair in l:
    # Stuff...

当这些
l
值输入时,您能将其放入数据库吗?然后您可以对数据库运行查询,而无需自己迭代所有行。我可以,但我希望有一个python解决方案在现实中,我很可能会使用数据库,因为python在这方面总是比较慢,但是,在我从事的其他项目中,我可能无法使用数据库,因此最好使用一种类似搜索的方法来比较字典列表。当这些
l
值出现时,您可以将其放入数据库吗?然后您可以对数据库运行查询,而无需自己迭代所有行。我可以,但我希望有一个python解决方案在现实中,我很可能会使用数据库,因为python在这方面总是比较慢,但在我所从事的其他项目中,我可能无法使用数据库,使用
l
作为变量名,可以使用类似搜索的最佳方法来比较字典列表。我喜欢:)如果出于某种原因,你无法控制输入,你可以在输入时将其转换为这种格式。我已经考虑过,我唯一的问题是这个列表在其他几个地方被访问,它的设置方式使它更简单……我也可以复制并存储两个单独的对象,一个列表和一本字典。@Keeler是的,我同意。自从OP使用它以来,我一直保留着它,我假设它实际上没有在代码中使用。至少我希望不会…@Yuushi不担心它没有使用
l
作为变量名。我喜欢:)如果出于某种原因,你无法控制输入,你可以在输入时将其转换为这种格式。我已经考虑过,我唯一的问题是这个列表在其他几个地方被访问,它的设置方式使它更简单……我也可以复制并存储两个单独的对象,一个列表和一本字典。@Keeler是的,我同意。自从OP使用它以来,我一直保留着它,我假设它实际上没有在代码中使用。至少我希望不会…@Yuushi别担心不是