有什么可以更好地替代这个For?



我是一个初学者,试图用Python 3.x编写一个关于交易的游戏。

我有两个类(仓库和好)。类Good的实例存储在depot内部的字典中。inv(实例作为Key,其数量作为Value)。当用户被要求写下他想要取的东西时,他将写下实例的名称('Iron'而不是ir)。所以我用循环语句搜索了仓库的所有库存。如果他发现用户的回复是=任何实例的名称(例如ir.name),那么程序就可以作为一个整体访问该实例。

问题是,如何在没有for循环的情况下做到这一点?

我想每次回复都要搜索整个库存并不是最优的,如果是线性搜索就更不理想了。

class Depot:
def __init__ (self, name, inv, bank):
self.name = name
self.inv = inv
self.bank = bank
class Good:
def __init__(self, name, weight, rare):
self.name = name
self.weight = weight
self.rare = rare
ir = Good('Iron', 1, 0.1)
gd = Good('Gold', 0.4, 2)
sl = Good('Silver', 0.7, 6.3)
mars = Depot('Mars', {ir: 10500, gd: 800, sl: 6000}, 1000)
player = {ir: 100}
reply = input('What do you want to take?')
i, q = reply.split()
for k in mars.inv.keys():    #This is the crux of the problem
if i in k.name:
x = k
print('Got it')
if x in mars.inv:
if int(q) > mars.inv[x]:
print('We dont have that much.')
elif int(q) <= mars.inv[x]:
mars.inv[x] -= int(q)
if x in player:
player[x] += int(q)
elif i not in player:
player[x] = int(q)

使用列表推导式和next()允许您只查找您正在查找的项目的第一次出现,然后停止。在找到要找的键后打破for循环也会达到同样的效果。都是O(n)没有太多的空间可以优化。单行符是

x = next((k for k in mars.inv.keys() if i in k.name), None)

我可能会复制名称作为字典的键,并将其映射到其他信息的元组:

{"Iron": (ir, 10500), "Gold": (gd, 800), "Silver": (sl, 6000}

然后你可以做mars.inv["Iron"]来得到(ir, 10500)的元组,你可以从中提取任何你想要的数据。


注意,这需要名称上的精确匹配。您当前使用in来执行检查,这将阻止任何优化。由于从您的描述中,您正在根据确切的名称进行查找(忽略大小写,因为这很容易解释),因此in是不必要的。

相关内容

  • 没有找到相关文章

最新更新