我想翻开以下词典:
dictionary = {
4388464: ['getting']
827862 : ['Taruma', 'Varuna']
...
}
成:
dictionary = {
4: {3: {8: {8: {4: {6: {4: {'words': ['getting']}}}}}}}
8: {2: {7: {8: {6: {2: {'words': ['Taruma', 'Varuna']}}}}}}
...
}
这样我就可以使用以下词典:dictionary[8][2][7][8][6][2]['words']
而不是:dictionary[827862]
。
答案 0 :(得分:5)
import pprint
dictionary = {
4388464: ['getting'],
43881: ['got'],
827862 : ['Taruma', 'Varuna'],
}
d2 = {}
def add_it(d, k, words):
knum = int(k[0])
if len(k) == 1:
d[knum] = {'words': words}
else:
dsub = d.setdefault(knum, {})
add_it(dsub, k[1:], words)
for k, words in dictionary.items():
add_it(d2, list(str(k)), words)
pprint.pprint(d2)
打印:
{4: {3: {8: {8: {1: {'words': ['got']},
4: {6: {4: {'words': ['getting']}}}}}}},
8: {2: {7: {8: {6: {2: {'words': ['Taruma', 'Varuna']}}}}}}}
答案 1 :(得分:0)
制作词典的简短解决方案:
def num2dict( n, d ):
if n < 10:
return { n: d }
else:
q, r = divmod( n, 10 )
return num2dict( q, { r: d } )
print( num2dict( 4388464, { 'words': [ 'getting' ] } ) )
答案 2 :(得分:0)
您可以尝试使用递归的defaultdict:
from collections import defaultdict
# define a hierarchical defaultdict (of defaultdicts (of defaultdicts...))
class recursivedefaultdict(defaultdict):
def __init__(self):
self.default_factory = type(self)
# add an iterator recursively to create entries, sub-entries, etc.
def addToTree(it, v, accum):
try:
addToTree(it, v, accum[it.next()])
except StopIteration:
accum["words"] = v
# test it out
dictionary = {
4388464: ['getting'],
43881: ['got'],
827862 : ['Taruma', 'Varuna'],
}
d2 = recursivedefaultdict()
for k,v in dictionary.iteritems():
addToTree(iter(str(k)), v, d2)
# use recursion again to view the results
def dumpDict(d,indent=""):
for k,v in d.iteritems():
if k == "words":
print "%s- %s : %s" % (indent, k, v)
else:
print "%s- %s:" % (indent, k)
dumpDict(v, indent+" ")
dumpDict(d2)
给出:
- 8:
- 2:
- 7:
- 8:
- 6:
- 2:
- words : ['Taruma', 'Varuna']
- 4:
- 3:
- 8:
- 8:
- 1:
- words : ['got']
- 4:
- 6:
- 4:
- words : ['getting']
我认为递归defaultdict是一种创建这些不可预测长度的嵌套dicts的漂亮方法。 (请注意,如果我们添加的下一个值使用43884作为键,则会出现问题,因为已存在d2[4][3][8][8][4]
的条目。)