python - 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() 更好(但这会占用一些内存空间)?
解决方案
“标准”方式类似于
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()
推荐阅读
- asp.net - 初始化字符串的格式不符合从索引 0 开始的规范
- html - 如何使用 flexbox css 使卡片项目始终具有相同的大小
- docker - 在 docker 内运行 docker
- firefox - Spotify api invalid_grant,仅 Firefox 中的授权码无效
- python - Django 寻找我可以在 object.filter 中使用的变量
- go-cd - 看不到 GoCD 服务器管理页面
- react-native - Android - “react-native-gesture-handler”库的“主”模块字段无法在 Azure CI 中解析,并且在本地机器上工作正常
- python - 保护python文件不被更改
- excel - Excel 上下文菜单无法在一台机器上运行,但在另一台机器上运行
- javascript - 使用 Promise.allSettled 时的 TypeScript 问题