python字典元素由什么组成_从Python字典中获取任意元素的最快方式是什么?

有多种方式,但您需要做出一些权衡.一种方法是使用

popitem清空字典;它是原子的,并且将使用任意的顺序.但它修改了字典本身;任何选择的项目都不在其中.下面想到的方法是像往常一样迭代,即使在修改字典时也是如此;项目的顺序可能会改变,所以你可以获得项目任何次数.为了跟踪,您可以构建第二个

set的可见键.加入密钥到集合是相当便宜的,便宜检查每个项目是否在其中,当您浏览整个字典时,您可以检查该集合是否匹配字典的密钥,以确定是否有您错过的(或去除).你最终建立一个密钥集,但每次迭代只有一个项目;在pessimal案例中,我们将字典修改为在查找新项目之前扫描整个被访问项目的方式.

是否有原因需要将数据保存在字典中?例如,如果我们考虑一个我们正在洗牌的系统,我们可能不想访问整个图书馆,但只限制一首歌曲的播放速度.这可以使用歌曲列表更有效地处理,其中我们可以读取随机索引,一组最近播放的歌曲以避免重复,以及排队(可能在列表或deque)中的歌曲,允许我们按顺序更新该集合(每次迭代删除最后一个条目).请记住,参考文献相当便宜.

再反思一次,如果不是我们的候选人,我们不需要密钥来检查重复项;通过将随机选择的下一首歌曲最早播放的歌曲进行交换,播放的和候选列表都保持不变的大小,并且不需要查找,因为歌曲只在其中一个列表中.

另一个想法是使用collections.ChainMap来保持两个字典的一致视图;被访问的和没有访问的那些.然后,您可以通过popitem将项目从后者迁移到前者,确保处理集合中的所有内容的可读方法,同时保持字典类似.

def getnewitem(chainmap):

# Raises KeyError when finished

key,value=chainmap.maps[0].popitem()

chainmap.maps[1][key]=value

return key,value

因为这意味着这两个词典都在不断变化,它可能不是最快的整体,但它保留了一个词典集合和处理所有项目的能力.它确实失去了直接删除项目的能力,因为ChainMap不能隐藏继承的映射;您需要从支持字典中删除它们.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值