'.join'问题(python错误)未删除{}或" "



我试图建立一个基本的库存系统,如果你找到一个项目,你可以查看项目的价值。当我运行代码时,一切似乎都很好,但联接函数似乎不起作用,因为仍然有这个{}、这个和这个"。我想我可能把代码弄得过于复杂了,所以如果你知道一种缩短代码的方法,请随意评论。

import random
class Player():
inv = {}
def __init__(self, hp, dmgl, dmgh):
self.hp = hp
self.dmgl = dmgl
self.dmgh = dmgh
player = Player(100, 20, 30)
def game():
while True:
weapon = input("Enter name of weapon that you want: ")
durability = int(input("Enter durability for " + str(weapon) + ": "))
player.inv.update({weapon: {"name": weapon, "durability": durability}})

view_inv = input("Do you wish to view your inventory? ")
if view_inv == 'yes':
view_item = input("Name of item: ")
if view_item in player.inv:
get_item_info = player.inv.get(view_item)
print(str(view_item) + ":" , ",".join({str(get_item_info) for v in player.inv}))

game()

用替换打印行

prop = ", ".join([f"{key}: {val}" for key, val in get_item_info.items()])
print(f"{view_item}: {prop}")

get_item_info.items()为字典中的每个条目生成键值对的元组列表:[(name, theName), (durability: 10), ...]

f"{key}: {val}" for key, val in ...为每个元组创建一个字符串。

使用", ".join(..将字符串列表连接在一起。

我认为打印报表应该读取

print(str(view_item) + ": " + " ".join([f'{k}: {v}' for k, v in get_item_info.items()]))

如果这是我的代码,我会编写一个通用函数,它接受一个字典,并返回字典的单行字符串表示,如下所示:

def pprint_dict(dictionary):
"""Return a single line string of all keys and values in the dictionary."""
out = " ".join([f'{k}: {v}' for k, v in dictionary.items()])
return out

但如果它真的是我的代码,pprint_dictionary将采用一个可选的keys参数,该参数将允许我指定字典中我想要的键:

def pprint_dict(dictionary, keys=None):
"""Return a single line string of all keys and values in keys."""
if keys is None:
keys = dictionary.keys()
out = " ".join([f'{k}: {v}' for k, v in dictionary.items() if k in keys])
return out

然后,在你上面的打印声明中,它会写道:

print(str(view_item) + ": " pprint_dict(get_item_info)

只需将名称从player更改为Player,因为Python区分大小写,并且您在代码中的所有位置都使用了错误的名称player

固定代码

class Player():
inv = {}
def game():
while True:
weapon = input("Enter name of weapon that you want: ")
durability = int(input("Enter durability for " + str(weapon) + ": "))
Player.inv.update({weapon: {"name": weapon, "durability": durability}})

view_inv = input("Do you wish to view your inventory? ")
if view_inv == 'yes':
view_item = input("Name of item: ")
if view_item in Player.inv:
get_item_info = Player.inv.get(view_item)
print(str(view_item) + ":" , ",".join({str(get_item_info) for v in Player.inv}))

game()

输出

Enter name of weapon that you want: ga
Enter durability for ga: 100
Do you wish to view your inventory? yes
Name of item: ga
ga: {'name': 'ga', 'durability': 100}
Enter name of weapon that you want:
....

但是

逻辑有点错误,我想让它更具功能性

因此,在类Player中添加了两个方法,用于添加以更干净的方式从库存中检索项目。

还有

  • 我列出了一个输入列表,这样我就可以快速测试逻辑
  • 删除了未使用的导入语句

这是最后的代码

class Player():
def __init__(self):
self.inv = {}
def add_item(self, inventory_type, name, durability):

inventory_type = inventory_type.title()
name = name.title()

if any([i for i in self.inv.get(inventory_type, []) if i["name"] == name]):
print("[Error] Item with same name already exists!")
return
if self.inv.get(inventory_type, None) == None:
self.inv[inventory_type] = [
{"name": name, "durability": durability}
]

else:
self.inv[inventory_type].append(
{"name": name, "durability": durability}
)
print(f"[Success] Item Named "{name}" of type "{inventory_type}" inserted in Inventory!")

def get_item(self, view_item):
view_item = view_item.title()
for inventory_type in self.inv:
for item in self.inv[inventory_type]:
# print(item)
if item["name"] == view_item:
return f"{inventory_type}: {item}"

def game():
# while True:
player1 = Player()
# inventory_type = input("Enter type of the inventory_type: ")
# name = input("Enter name of the inventory_type: ")
# durability = int(input(f"Enter durability for {inventory_type} named {name!s}: "))
items = [
("sword", "Nightmaria2", 150),
("shield", "defencia", 100),
("sword", "Nightmare", 120),
("sword", "Nightmare", 30)
]
# Add Items in player1's inventory
for item in items:
player1.add_item(*item)

# Display Items using their name
for item in items:
if (item_info := player1.get_item(item[1])):
print(item_info)

game()

输出

[Success] Item Named "Nightmaria2" of type "Sword" inserted in Inventory!
[Success] Item Named "Defencia" of type "Shield" inserted in Inventory!
[Success] Item Named "Nightmare" of type "Sword" inserted in Inventory!
[Error] Item with same name already exists!
Sword: {'name': 'Nightmaria2', 'durability': 150}
Shield: {'name': 'Defencia', 'durability': 100}
Sword: {'name': 'Nightmare', 'durability': 120}
Sword: {'name': 'Nightmare', 'durability': 120}

我改变了插入物品的主要逻辑,使玩家的库存中可以有多把剑,所以,

我列出了一个列表来存储它,此外,我还处理重复项,以防玩家试图添加相同类型的同名项目。

最新更新