如何在元组中搜索未知值?
我的字典的格式为:
d = {
(0,3): 1234,
(2,6): 22,
(1,3): 45,
(3,4): 55,
...
}
我将如何搜索以查找包含值2的所有键?
基本上,耗时的解决方案是
vals = [2 in item for item in d.keys()],
但是,有什么方法可以使用字典查询的O(1)
摊销时间复杂度?
答案 0 :(得分:0)
不。您将元组用作键,以便创建元组的哈希。字典中的<link href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" rel="stylesheet"/>
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.5.0/proj4.js"></script>
<div>
<h4>Untranslated plus useInterimTilesOnError: false</h4>
<div id="untranslated-false" class="map"></div>
</div>
<div>
<h4>Untranslated plus useInterimTilesOnError: true</h4>
<div id="untranslated-true" class="map"></div>
</div>
<div>
<h4>Translated plus useInterimTilesOnError: false</h4>
<div id="false" class="map"></div>
</div>
<div>
<h4>Translated plus useInterimTilesOnError: true</h4>
<div id="true" class="map"></div>
</div>
<div>
<h4>Projected plus useInterimTilesOnError: false</h4>
<div id="projected-false" class="map"></div>
</div>
<div>
<h4>Projected plus useInterimTilesOnError: true</h4>
<div id="projected-true" class="map"></div>
</div>
复杂度仅适用于元组键。如果要在元组中找到 ,则必须遍历所有键。
您可以创建自己的字典类来存储此类信息,但我认为这种方式不适合您。
答案 1 :(得分:0)
如果需要以这种方式执行多次查找,则需要创建一个新结构。
d = {
(0,3): 1234,
(2,6): 22,
(1,3): 45,
(3,4): 55,
}
使用defaultdict:
from collections import defaultdict
mapping = defaultdict(list)
for key in d:
for i in key:
mapping[i].append(key)
print(mapping)
输出:
defaultdict(list,
{0: [(0, 3)],
3: [(0, 3), (1, 3), (3, 4)],
2: [(2, 6)],
6: [(2, 6)],
1: [(1, 3)],
4: [(3, 4)]})
这项一次性的O(n)操作构成了一个映射,您现在可以将其用于O(1)查找。
print(mapping[2])
#Output:
[(2, 6)]
您还可以使用这些键来访问所有与条件匹配的键-值对:
print({k: d[k] for k in mapping[2]})
#Output:
{(2, 6): 22}
答案 2 :(得分:0)
不是直接的,不是-字典不是关系数据库,您只能进行精确的查找(就像其他任何哈希表FWIW一样)。
如果必须多次执行此查找(在同一字典上),则可以构建一个中间索引:
from collections import defaultdict
def build_index(d):
index = defaultdict(list)
# I assume you're interested in the values, else
# change the code accordingly
for k, v in d.iteritems():
for sub in k:
index[sub].append(v)
return dict(index)
index = build_index(d)
matching_values = index.get(2, None)
答案 3 :(得分:0)
您可以构建索引字典以将元组与其值相关联,并使用它来获取O(1)时间中的元组列表。
d = {
(0,3): 1234,
(2,6): 22,
(1,3): 45,
(3,4): 55,
(5,2): 97
}
from collections import defaultdict
dIndex = defaultdict(list)
[dIndex[k].append(t) for t in d for k in t]
keysWith2 = dIndex[2]
print(keysWith2) # [(2, 6), (5, 2)]
仅当d
的键更改时,您才需要更新dIndex词典。您还可以将这些元组列表转换为值列表(也在O(1)时间内):
valuesOf2 = [d[t] for t in dIndex[2]] # [22, 97]