我有来自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]
编辑如果没有明确的问题我准备澄清
答案 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
所以我猜答案是561618565051829
或5*************9
。