首页 > 解决方案 > python中的元组键字典:访问整个条目块

问题描述

我正在寻找一种有效的 python 方法来利用具有两个键的哈希表:例如:

(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-pairs 的对象中检索值的最有效方法。然而,只调用一个不完整的元组键与查询整个键有点不同,我要么得到一个值,要么什么也没得到。我想问一下python是否仍然可以在与匹配的键:值对数量成正比的时间内返回值?或者,元组字典(加上列表理解)是否比使用 pandas.df.groupby() 更好(但这会占用一些内存空间)?

标签: pythondictionarydictionary-comprehension

解决方案


“标准”方式类似于

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()and 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

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

当然你也可以通过 来访问密钥x[1],你只需要在调用中添加一个key参数sort()


推荐阅读