如何迭代多个字典键列表(值)对
How to iterate over multiple dictionary key list(value) pairs
所以,我正在尝试创建一个游戏。在此游戏机制中,用户尝试使用字典中的项目。
inventory = {
"Health": ["Potion", "Hi-Potion","Elixer"],
"Weapons": ["Blade","Dagger","Staff"],
"Items": ["Glass", "Paper","Notes"],
"Components": ["Rusty Trombone"],
}
# Add and Use item
def add_to_inventory(item_type, item_name):
inventory[item_type].append(item_name)
def use_item():
for item_type, item_name in inventory.items():
print(item_type.title(),":",item_name)
use_item = input("What will you use? \n").title()
if use_item in inventory["Health"]:
position = inventory["Health"].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory["Health"].pop(position)
elif use_item in inventory["Weapons"]:
position = inventory["Weapons"].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory["Weapons"].pop(position)
elif use_item in inventory["Items"]:
position = inventory["Items"].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory["Items"].pop(position)
elif use_item in inventory["Components"]:
position = inventory["Compoents"].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory["Components"].pop(position)
use_item()
有很多冗余,但我找不到如何缩短我的代码。
使用 use_item 功能,我想首先让用户查看整个库存,以便更轻松地选择要使用的内容。然后是使用物品的提示。
我想保留所有字符串的 title 方法,以防将来多个单词项目需要将首字母大写。
使用位置变量可以让我获得正在使用的项目的索引位置。这使我可以使用 pop 方法不仅从库存中丢弃物品,而且 return 该物品用于其预期用途(开门的钥匙,使用武器,恢复健康,修补)。
所有的机制都还没有编码,但我越看这部分就越觉得它可以做得更好。我不知道该怎么做。
我正在考虑遍历每个键值对,然后从字典中丢弃该项目。但是,我需要 pop 方法 return 有问题的项目(并结束该功能)。我 运行 因具有列表值的键而陷入困境。作为列表的值使其更容易浏览,但也提出了需要进一步迭代的问题——可能使用嵌套的 for 循环?但是后来我不确定如何实现它以适应这种情况。
由于您对字典中的每个键执行相同的操作,因此您可以改用 for
循环:
for key in inventory:
if use_item in inventory[key]:
position = inventory[key].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory[key].pop(position)
由于您多次重复相同的操作,您可以将其移动到 for
循环中的函数。
.remove()
用一种方法 index
和 pop
def discard(user_item, inventory):
for k, v in inventory.items():
if user_item in v:
print(
f"You've used {user_item}. {user_item} will now be discarded.")
inventory[k].remove(user_item)
return user_item
def use_item():
for item_type, item_name in inventory.items():
# Join will join elements nicely
# Use an f string to easily edit string format
print(f"{item_type.title()}: {', '.join(item_name)}")
# Try not to name variables after your function name
user_item = input("What will you use? \n").title()
discard(user_item, inventory)
其他建议已在
中评论
所以,我正在尝试创建一个游戏。在此游戏机制中,用户尝试使用字典中的项目。
inventory = {
"Health": ["Potion", "Hi-Potion","Elixer"],
"Weapons": ["Blade","Dagger","Staff"],
"Items": ["Glass", "Paper","Notes"],
"Components": ["Rusty Trombone"],
}
# Add and Use item
def add_to_inventory(item_type, item_name):
inventory[item_type].append(item_name)
def use_item():
for item_type, item_name in inventory.items():
print(item_type.title(),":",item_name)
use_item = input("What will you use? \n").title()
if use_item in inventory["Health"]:
position = inventory["Health"].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory["Health"].pop(position)
elif use_item in inventory["Weapons"]:
position = inventory["Weapons"].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory["Weapons"].pop(position)
elif use_item in inventory["Items"]:
position = inventory["Items"].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory["Items"].pop(position)
elif use_item in inventory["Components"]:
position = inventory["Compoents"].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory["Components"].pop(position)
use_item()
有很多冗余,但我找不到如何缩短我的代码。
使用 use_item 功能,我想首先让用户查看整个库存,以便更轻松地选择要使用的内容。然后是使用物品的提示。 我想保留所有字符串的 title 方法,以防将来多个单词项目需要将首字母大写。 使用位置变量可以让我获得正在使用的项目的索引位置。这使我可以使用 pop 方法不仅从库存中丢弃物品,而且 return 该物品用于其预期用途(开门的钥匙,使用武器,恢复健康,修补)。
所有的机制都还没有编码,但我越看这部分就越觉得它可以做得更好。我不知道该怎么做。
我正在考虑遍历每个键值对,然后从字典中丢弃该项目。但是,我需要 pop 方法 return 有问题的项目(并结束该功能)。我 运行 因具有列表值的键而陷入困境。作为列表的值使其更容易浏览,但也提出了需要进一步迭代的问题——可能使用嵌套的 for 循环?但是后来我不确定如何实现它以适应这种情况。
由于您对字典中的每个键执行相同的操作,因此您可以改用 for
循环:
for key in inventory:
if use_item in inventory[key]:
position = inventory[key].index(use_item)
print(f"You've used {use_item}. {use_item} will now be discarded.")
return inventory[key].pop(position)
由于您多次重复相同的操作,您可以将其移动到
for
循环中的函数。.remove()
用一种方法index
和pop
def discard(user_item, inventory):
for k, v in inventory.items():
if user_item in v:
print(
f"You've used {user_item}. {user_item} will now be discarded.")
inventory[k].remove(user_item)
return user_item
def use_item():
for item_type, item_name in inventory.items():
# Join will join elements nicely
# Use an f string to easily edit string format
print(f"{item_type.title()}: {', '.join(item_name)}")
# Try not to name variables after your function name
user_item = input("What will you use? \n").title()
discard(user_item, inventory)
其他建议已在
中评论