Python 制作嵌套字典的代码正确吗?

Python 制作嵌套字典的代码正确吗?,python,dictionary,for-loop,Python,Dictionary,For Loop,我对这篇文章的答案中给出的代码有一些问题: 我想得到以下词典: count = {'b': {'king': 1, 'pawn': 3, 'bishop': 1}, 'w': {'king': 1, 'rook': 1, 'queen': 1}} 收到的错误: Traceback (most recent call last): File "/Users/Andrea_5K/Library/Mobile Documents/com~apple~CloudDoc

我对这篇文章的答案中给出的代码有一些问题:

我想得到以下词典:

count = {'b': {'king': 1, 'pawn': 3, 'bishop': 1},
         'w': {'king': 1, 'rook': 1, 'queen': 1}}
收到的错误:

Traceback (most recent call last):
  File "/Users/Andrea_5K/Library/Mobile Documents/com~apple~CloudDocs/automateStuff2/ch5/flatToNest2.py", line 21, in <module>
    count[k[0]][k[1:]] = v
KeyError: '1'
回溯(最近一次呼叫最后一次):
文件“/Users/Andrea_5K/Library/Mobile Documents/com~apple~CloudDocs/automateStuff2/ch5/flatToNest2.py”,第21行,在
计数[k[0]][k[1:][]=v
KeyError:“1”

OP评论说输出应该是每件物品的计数。使用以下方法可以实现这一点:


OP评论说输出应该是每件物品的数量。使用以下方法可以实现这一点:


代码中的问题是,当您访问
nested[k[0]]
时,您希望
nested
已经具有此键,并且您希望相应的值是dict

解决此问题的最简单方法是使用可在需要时动态创建的:

from collections import defaultdict

board = {
    '1a': 'bking',
    '4e': 'bpawn',
    '2c': 'bpawn',
    '3f': 'bpawn',
    '5h': 'bbishop',
    '6d': 'wking',
    '7f': 'wrook',
    '2b': 'wqueen'
}

nested = defaultdict(dict)
for k, v in board.items():
    nested[k[0]][k[1:]] = v
print(nested)

# defaultdict(<class 'dict'>, {'1': {'a': 'bking'}, '4': {'e': 'bpawn'}, '2': {'c': 'bpawn', 'b': 'wqueen'}, '3': {'f': 'bpawn'}, '5': {'h': 'bbishop'}, '6': {'d': 'wking'}, '7': {'f': 'wrook'}})
从集合导入defaultdict
董事会={
‘1a’:‘bking’,
'4e':'bpawn',
‘2c’:‘bpawn’,
“3f”:“bpawn”,
“5h”:“bbishop”,
‘6d’:‘工作’,
‘7f’:‘wrook’,
‘2b’:‘wqueen’
}
嵌套=默认dict(dict)
对于板中的k,v.items():
嵌套的[k[0]][k[1:][]=v
打印(嵌套)
#defaultdict(,{'1':{'a':'bking'},'4':{'e':'bpawn'},'2':{'c':'bpawn','b':'wqueen'},'3':{'f':'bpawn'},'5':{'h':'bbishop'},'6':{'d':'wking'},'7':{'f':'wrook'})

代码中的问题是,当您访问
nested[k[0]]
时,您希望
nested
已经具有此键,并且您希望相应的值是dict

解决此问题的最简单方法是使用可在需要时动态创建的:

from collections import defaultdict

board = {
    '1a': 'bking',
    '4e': 'bpawn',
    '2c': 'bpawn',
    '3f': 'bpawn',
    '5h': 'bbishop',
    '6d': 'wking',
    '7f': 'wrook',
    '2b': 'wqueen'
}

nested = defaultdict(dict)
for k, v in board.items():
    nested[k[0]][k[1:]] = v
print(nested)

# defaultdict(<class 'dict'>, {'1': {'a': 'bking'}, '4': {'e': 'bpawn'}, '2': {'c': 'bpawn', 'b': 'wqueen'}, '3': {'f': 'bpawn'}, '5': {'h': 'bbishop'}, '6': {'d': 'wking'}, '7': {'f': 'wrook'}})
从集合导入defaultdict
董事会={
‘1a’:‘bking’,
'4e':'bpawn',
‘2c’:‘bpawn’,
“3f”:“bpawn”,
“5h”:“bbishop”,
‘6d’:‘工作’,
‘7f’:‘wrook’,
‘2b’:‘wqueen’
}
嵌套=默认dict(dict)
对于板中的k,v.items():
嵌套的[k[0]][k[1:][]=v
打印(嵌套)
#defaultdict(,{'1':{'a':'bking'},'4':{'e':'bpawn'},'2':{'c':'bpawn','b':'wqueen'},'3':{'f':'bpawn'},'5':{'h':'bbishop'},'6':{'d':'wking'},'7':{'f':'wrook'})

如果您只需要计数,请使用
集合。计数器
,然后使用
集合。defaultdict
拆分结果:

counts = defaultdict(dict)
for piece, count in Counter(board.values()).items():
    counts[piece[0]][piece[1:]] = count

如果只需要计数,请使用
collections.Counter
,然后使用
collections.defaultdict
拆分结果:

counts = defaultdict(dict)
for piece, count in Counter(board.values()).items():
    counts[piece[0]][piece[1:]] = count


将堆栈跟踪添加到question@MadPhysicist什么意思?我在这个问题中添加了一个指向OP的链接,在OP的评论中添加了一个指向这个问题的链接。你还想让我做什么?你需要发布预期的输出和异常消息。那么,你想对位置信息做些什么吗?将堆栈跟踪添加到你的question@MadPhysicist什么意思?我在这个问题中添加了一个指向OP的链接,在OP的评论中添加了一个指向这个问题的链接。你还想让我做什么?你需要发布预期的输出和例外的消息。那么,你想对位置信息做些什么吗?像这样使用
setdefault
的缺点是它总是生成一个新字典,“大部分都被浪费掉了,”物理学家疯狂地说,“如果字典不存在,它不是只会编一本吗?”?然后,下一行使用字典,即嵌套的[k[0]][k[1:]]不,它仅在不存在键的情况下添加字典<代码>{}始终创建新的dictionary@MadPhysicist--是的,我同意setdefault(…)总是计算默认值。那么,您是说默认值的计算是一个问题,因为它创建了一个可能不被使用的默认字典?我同意,但我认为在这种情况下,速度差没有意义。同意吗?我就是这么说的。在这种情况下,速度和微小的内存碎片可能不是问题,但这是需要注意的。像这样使用
setdefault
的缺点是,它总是制作一本新词典,而这大部分都是浪费。@MadPhysicator——难道不只是在没有词典的情况下才制作词典吗?然后,下一行使用字典,即嵌套的[k[0]][k[1:]]不,它仅在不存在键的情况下添加字典<代码>{}始终创建新的dictionary@MadPhysicist--是的,我同意setdefault(…)总是计算默认值。那么,您是说默认值的计算是一个问题,因为它创建了一个可能不被使用的默认字典?我同意,但我认为在这种情况下,速度差没有意义。同意吗?我就是这么说的。在这种情况下,速度和内存碎片可能不是问题,但需要注意。谢谢。但我需要另一个解决方案:我的嵌套字典应该包含棋盘上每一块棋子的计数。例如:count={'b':{'king':1,'pawn':3,'bishop':1},'w':{'king':1,'rook':1,'queen':1}谢谢。但我需要另一个解决方案:我的嵌套字典应该包含棋盘上每一块棋子的计数。例如:count={'b':{'king':1,'pawn':3,'bishop':1},'w':{'king':1,'rook':1,'queen':1}谢谢。我只需要字典计数={'b':{'king':1,'pawn':3,'bishop':1},'w':{'king':1,'rook':1,'queen':1})。因为我想将它用于不同的验证测试,正如你在OP中提到的。你是如何分割结果的?@aurumpruum。我很确定这就是我要输出的,但我在手机上,所以现在无法测试变量计数持有defaultdict(,{'b':{'king':1,'pawn':3,'bishop':1},'w':{'king':1,'rook':1,'queen':1}),但我只想要这本字典。@Aurumpur。defaultdict是dict的一个子类。如果你想得到一个普通的dict,你可以做
counts=dict(counts)
,但这确实是不必要的。您可以对defaultdict执行与对dict相同的操作。唯一真正的区别是,当您访问丢失的密钥时,它会为您创建一个密钥。谢谢。我只是