写一段python代码使键和值倒置_Python中的就地字典倒置

I need to invert a dictionary of lists, I don't know how to explain it in English exactly, so here is some code that does what I want. It just takes too much memory.

def invert(oldDict):

invertedDict = {}

for key,valuelist in oldDict.iteritems():

for value in valuelist:

try:

entry = invertedDict[value]

if key not in entry:

entry.append(key)

except KeyError:

invertedDict[value] = [key]

return invertedDict

The original is a dict of lists, and the result is a dict of lists. This "inverts" it.

test = {}

test[1] = [1999,2000,2001]

test[2] = [440,441]

test[3] = [440,2000]

print invert(test)

This gives:

{2000: [1, 3], 2001: [1], 440: [2, 3], 441: [2], 1999: [1]}

I need to know if this can be done in-place, because my current strategy is exceeding the amount of physical memory on my machine with the dictionary I am working with. Can you think of a way to do it with generators?

解决方案

This doesn't do it in place, but consumes oldDict by using popitem()

from collections import defaultdict

def invert(oldDict):

invertedDict = defaultdict(list)

while oldDict:

key, valuelist = oldDict.popitem()

for value in valuelist:

invertedDict[value].append(key)

return invertedDict

I have a feeling that dict's are never resized unless the size increases, so you may need to add+remove a dummy item periodically. See Shrinkage rate

from collections import defaultdict

def invert(oldDict):

invertedDict = defaultdict(list)

i=0

while oldDict:

key, valuelist = oldDict.popitem()

for value in valuelist:

invertedDict[value].append(key)

i+=1

if i%1000==0: # allow the dict to release memory from time to time

oldDict[None]=None

del oldDict[None]

return invertedDict

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值