查找列表中元素的最快方法

时间:2014-06-13 06:09:12

标签: python list

我有来自mrange(10**16,10**17)的数字列表(mrange是我的自定义范围生成器) 我有包含index:value

的字典列表
newcombos= [{0: '5', 1: '6'}, {0: '5', 2: '1'}, {0: '5', 3: '6'}, {0: '5', 4: '1'}, {0: '5', 5: '8'}, {0: '5', 6: '5'}, {0: '5', 7: '6'}, {0: '5', 8: '5'}, {0: '5', 9: '0'}, {0: '5', 10: '5'}, {0: '5', 11: '1'}, {0: '5', 12: '8'}, {0: '5', 13: '2'}, {0: '5', 14: '9'}..]

取一个ie {0: '5', 1: '6'}表示索引5中的值0和索引6中的值1 我需要过滤number列表,其中包含索引0处的5和索引1处的6,以及总列表字典中的soo。

我正在使用

temp=[]
for j in number:
        for i in newCombos:
            index=i.keys()
            val=i.values()

            if all(str(j)[index[l]]==val[l] for l in range(0,len(val))):
                    temp.append(j)
                    break


print temp

问题是总回路需要超过30分钟。我怎么能快速做到有没有办法可以更快

一个更清晰的小型演示

让数字为1到100的列表

number=[1,2,3,4,....99]

我有dict =[{0:'5',1:'0'},{0:'6',1:'7'}]的列表 在列表中我们只有50,67满足上面的dict所以它应该在100列表中返回[50,67]

编辑如果没有明确的问题我准备澄清

2 个答案:

答案 0 :(得分:1)

您可以使用 combos

[{0: '5', 1: '6'}, {1: '4', 2: '1'}, {0: '5', 3: '6'}, {0: '1', 2: '7'}]

成了

{
  0: {  
    1: {
      2: {7: True}, # for {0: '1', 2: '7'}
    }
    5: {
      1: {6: True}, # for {0: '5', 1: '6'}
      3: {6: True}, # for {0: '5', 3: '6'}
    }, 
  },
  1: {
    4: {
      2: {1: True}, # for {1: '4', 2: '1'}
    }
  }
}

因此您可以逐位检查每个number,并在条件满足后立即中断检查。

如何构建树

组合{1: 6, 0: 5}

(n[0] is 5) and (n[1] is 6) 注意:您应按位置对子条件进行排序。

这种情况变成了

{0: {5: {1: {6: True}}}}偶数深键是位置,奇数深是值

你应该在树中加入这个条件

<强>优化

您可以通过共享常见条件后缀来压缩树, 它将充分减少树木大小和检查时间

答案 1 :(得分:1)

This is not answer. Just comment.

我不知道这只是数学问题......见下文......

给定条件:

newcombos= [{0: '5', 1: '6'}, {0: '5', 2: '1'}, {0: '5', 3: '6'}, {0: '5', 4: '1'}, {0: '5', 5: '8'}, {0: '5', 6: '5'}, {0: '5', 7: '6'}, {0: '5', 8: '5'}, {0: '5', 9: '0'}, {0: '5', 10: '5'}, {0: '5', 11: '1'}, {0: '5', 12: '8'}, {0: '5', 13: '2'}, {0: '5', 14: '9'}]

满足给定条件的数字:

56
5*1
5**6
5***1
5****8
5*****5
5******6
5*******5
5********0
5*********5
5**********1
5***********8
5************2
5*************9
561618565051829

所以我猜答案是5616185650518295*************9