python 中的元组键字典:访问整个条目块

Tuple-key dictionary in python: Accessing a whole block of entries

我正在寻找一种有效的 python 方法来利用具有两个键的散列 table: 例如:

(1,5) --> {a}
(2,3) --> {b,c}
(2,4) --> {d}

此外,我需要能够检索整个条目块,例如在第 0 个位置具有“2”的所有条目(此处:(2,3) 以及 (2,4)) . 在另一个 中,建议使用列表理解,即:

sum(val for key, val in dict.items() if key[0] == 'B')

我了解到字典(可能?)是从 key:value 对对象中检索值的最有效方法。但是,只调用一个不完整的元组键与查询整个键有点不同,在整个键中我要么得到一个值,要么什么都没有。我想问一下 python 是否仍然可以 return 在与匹配的 key:value 对数量成正比的时间内得到值?或者,元组字典(加上列表理解)是否比使用 pandas.df.groupby() 更好(但这会占用一点内存 space)?

“标准”方式类似于

d = {(randint(1,10),i):"something" for i,x in enumerate(range(200))}

def byfilter(n,d):
    return list(filter(lambda x:x==n, d.keys()))

byfilter(5,d) ##returns a list of tuples where x[0] == 5

虽然在类似的情况下我经常使用 next() 手动迭代,当我不需要完整列表时。

但是,在某些用例中我们可以对其进行优化。假设您需要通过 key first 元素进行几次或更多次访问,并且您知道 dict 键同时没有改变。然后你可以提取列表中的键并对其进行排序,并使用一些 itertools 函数,即 dropwhile()takewhile():

ls = [x for x in d.keys()]
ls.sort() ##I do not know why but this seems faster than ls=sorted(d.keys())

def bysorted(n,ls):
    return list(takewhile(lambda x: x[0]==n, dropwhile(lambda x: x[0]!=n, ls)))
bysorted(5,ls) ##returns the same list as above

在最好的情况下(i=1 在我的示例中)这可以快 10 倍,在最坏的情况下(i=10)或多或少花费相同的时间,因为我们正在修剪需要的迭代次数。

当然你也可以通过x[1]访问密钥,你只需要在sort()调用

中添加一个key参数