Python 在不删除当前键的情况下向Dicts添加键
所以,我正在为我的游戏制作一个清单系统,但像往常一样,有一个错误。这当然是我的错,但我想不出办法。我需要代码在不替换当前键的情况下将项目添加到dict中。例如,玩家捕捉到一条鱼:Python 在不删除当前键的情况下向Dicts添加键,python,python-3.x,Python,Python 3.x,所以,我正在为我的游戏制作一个清单系统,但像往常一样,有一个错误。这当然是我的错,但我想不出办法。我需要代码在不替换当前键的情况下将项目添加到dict中。例如,玩家捕捉到一条鱼: inventory = {} #This is the dict to hold all the items for x in range(1,10): inventory['slot{0}'.format(x)] = {'type':'Fish'} break 但是如果你钓到两条鱼,它总是占据第一
inventory = {} #This is the dict to hold all the items
for x in range(1,10):
inventory['slot{0}'.format(x)] = {'type':'Fish'}
break
但是如果你钓到两条鱼,它总是占据第一个位置
###Output:
{'slot1':{'type':'Fish'}}
然后我试着做了一个if,一个关于插槽是否已满的声明,试着下一个
for x in range(1,10):
if inventory['slot{0}'.format(x)] != {}:
x += 1
inventory['slot{0}'.format(x)] = {'type':'Fish'}
break
以下是捕获的两条鱼的预期产量:
###Output
{'slot1':{'type':'fish'},'slot2':{'type':'fish}}
但是我得到了一个关键错误,即嵌套字典不存在。因此,我需要一些帮助。以下是预期输出的代码。实际上,您正在尝试在分配dict密钥之前访问它
inventory = {} #This is the dict to hold all the items
for x in range(1,10):
if 'slot{0}'.format(x) in inventory:
x += 1
inventory['slot{0}'.format(x)] = {'type':'Health'}
break
print(inventory)
您可以将新数据输入到新的dict
temp={}
,然后将其与主dictinventory={**inventory,**temp}
合并,正如注释中所述,这确实是一个列表作业。包括完整的字典版本
随附清单:
def get_slot_x(inventory, x):
return inventory[x]
def add_item(inventory, item):
for i, v in enumerate(inventory):
if v is None:
inventory[i] = v
break
else:
raise RuntimeError('nowhere to put item')
def empty_slot_x(inventory, x):
inventory[x] = None
inventory = [None] * 10
用dict:
slotname = lambda x: 'slot%d' % x
POSSIBLE_SLOTS = list(map(slotname, range(10)))
如果值为“无”,则表示为空:
def add_item(inventory, item):
for k, v in inventory.items():
if v is None:
inventory[k] = v
break
else:
raise RuntimeError('nowhere to put item')
def get_slot_x(inventory, x):
return inventory[slotname(x)]
def empty_slot_x(inventory, x):
inventory[slotname(x)] = None
inventory = collections.OrderedDict.fromkeys(POSSIBLE_SLOTS)
或者,如果您希望没有密钥表示为空:
def add_item(inventory, item):
for k in POSSIBLE_SLOTS:
if k not in inventory:
inventory[k] = v
break
else:
raise RuntimeError('nowhere to put item')
def get_slot_x(inventory, x):
return inventory.get(slotname(x))
def empty_slot_x(inventory, x):
inventory.pop(slotname(x), None)
inventory = {}
对于上述任何一项:
add_item(inventory, 'foobar')
assert get_slot_x(inventory, 0) is None
assert get_slot_x(inventory, 0) == 'foobar'
empty_slot_x(inventory, 0) # You may want to throw errors if nothing is there
assert get_slot_x(inventory, 0) is None
如果没有按下的原因,您也可以完全删除
slotname
,只使用整数作为键。您介意给出一个预期输出的示例吗?您有没有理由不使用列表?您可以添加您的项目。这是否回答了您的问题?你的for循环中的中断
没有意义,删除它标记我需要一个字典来映射项目这有些效果,问题是如果玩家的库存是空的,那么它会抛出一个错误,即没有slot1这样的东西,它会抛出错误,因为你的dict是空的。因此,如果“插槽{0}”,则应尝试此条件。库存中的格式(x):x+=1如果使用第一个和第二个插槽,则此操作将失败。这仅适用于第一个插槽。假设取了slot1
和slot2
,然后您将进入if
语句的主体,并且x
将变为2。然后退出if
语句,让inventory['slot2']={…}
覆盖插槽2中的内容。x+=1
应该改为continue
,它将跳回循环的顶部并进行下一次迭代。重复此操作,直到找到一个空插槽。