如何在未知的字典中搜索元组

时间:2019-06-11 13:51:05

标签: python dictionary lookup

如何在元组中搜索未知值?

我的字典的格式为:

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)摊销时间复杂度?

4 个答案:

答案 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]