Python 3代码缩短

时间:2017-04-13 21:46:06

标签: python python-3.x

我试图缩短我的代码

代码:

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

4 个答案:

答案 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