我试图缩短我的代码
代码:
inv = {'arrow': 12, 'gold coin': 42, 'rope': 2, 'torch': 4, 'dagger': 1}
def show_inv():
print('inventory:')
item_total = 0
for k, v in inv.items():
print(str(v)+ ' ' + (k) )
item_total = item_total + v
print('total number of items: ' + str(item_total) )
show_inv()
dragon = {'gold coin': 50, 'ruby': 15}
inv.update(dragon)
print()
print('after slaying dragon:')
show_inv()
无济于事,所以我在这里:)
这是
结果:
清单:
12箭头
42金币2根绳子
4火炬
1 dagger
项目总数:61
杀死龙之后清单:
12箭头
50金币
2根绳子
4火炬
1把匕首 15红宝石 项目总数:84
答案 0 :(得分:3)
如果你真的想要尽可能短的功能,你可以使用这个单线;)
show_inv = lambda: print('inventory:\n%s\n%s' % ('\n'.join(['%s %s' % (k,v) for k,v in inv.items()]),'total number of items: %s' % sum(inv.values())))
(请不要这样做)
答案 1 :(得分:3)
在你之前"缩短"你的代码确保它是正确的。目前inv.update
只会覆盖条目!
我建议使用Counter
代替dict
,因为它已经实现了您想要的逻辑:
>>> from collections import Counter
>>> inv = Counter({'arrow': 12, 'gold coin': 42, 'rope': 2, 'torch': 4, 'dagger': 1})
>>> dragon = Counter({'gold coin': 50, 'ruby': 15})
>>> inv.update(dragon)
>>> inv
Counter({'arrow': 12,
'dagger': 1,
'gold coin': 92, # the 42 and 50 are added!
'rope': 2,
'ruby': 15,
'torch': 4})
您使用的唯一功能是show_inv
。然而,这个功能的唯一目的是print
对象的表示,你可以做的不多"缩短"那里。这似乎是正确的。
但如果你有一个"对象" (dict
)和该对象的函数,你应该考虑使用"类"包装它。有些方法允许您自定义"字符串" -representation:__str__
和__repr__
,因此可以使用这些方法代替显式函数(或方法)调用:
from collections import Counter
class Inventory(Counter): # subclass Counter
def __str__(self): # overwrite the str-representation (this method is used by "print")
content = ['{} {}'.format(name, cnt) for name, cnt in self.items()]
content.insert(0, 'inventory:')
content.append('total number of items: {}'.format(sum(self.values())))
return '\n'.join(content)
inv = Inventory({'arrow': 12, 'gold coin': 42, 'rope': 2, 'torch': 4, 'dagger': 1})
print(inv)
# inventory:
# arrow 12
# gold coin 42
# dagger 1
# rope 2
# torch 4
# total number of items: 61
dragon = {'gold coin': 50, 'ruby': 15}
inv.update(dragon)
print(inv)
# inventory:
# ruby 15
# gold coin 92
# dagger 1
# rope 2
# torch 4
# arrow 12
# total number of items: 126
答案 2 :(得分:2)
您可以使用sum
功能而不是逐步增加总数,但除此之外,您还可以做很多事情:
inv = {'arrow': 12, 'gold coin': 42, 'rope': 2, 'torch': 4, 'dagger': 1}
def show_inv():
print('inventory:')
for k, v in inv.items():
print("%s %s" % (v,k))
print('total number of items: %s' % sum(inv.values()))
show_inv()
dragon = {'gold coin': 50, 'ruby': 15}
inv.update(dragon)
print()
print('after slaying dragon:')
show_inv()
答案 3 :(得分:-1)
至于更新库存,你可以尝试一个班轮
from functools import reduce
inv = reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.items()), (inv,dragon))
代码取自,我建议检查其他答案: How to sum dict elements