Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在不删除当前键的情况下向Dicts添加键_Python_Python 3.x - Fatal编程技术网

Python 在不删除当前键的情况下向Dicts添加键

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 但是如果你钓到两条鱼,它总是占据第一

所以,我正在为我的游戏制作一个清单系统,但像往常一样,有一个错误。这当然是我的错,但我想不出办法。我需要代码在不替换当前键的情况下将项目添加到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
但是如果你钓到两条鱼,它总是占据第一个位置

###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={}
,然后将其与主dict
inventory={**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
,它将跳回循环的顶部并进行下一次迭代。重复此操作,直到找到一个空插槽。