我正在解决一个问题,我必须编写一个程序来计算厨师准备的每个项目的数量。客户可以订购的物品是:沙拉、汉堡包和水。 salad:[# salad] hamburger:[# hamburger] water:[# water] 例如 If order = "hamburger water hamburger" 然后函数返回 "salad:0 hamburger:2 water:1"
我的代码是:

def ite(order,item):
    v=order.split()
    t=[]
    for salad in v:
        if salad==item:
            t.append(item)
            v.remove(item)
    return len (t)

def item_order(order):
    s=ite(order,'salad')
    h=ite(order,'hamburger')
    w=ite(order,'water')
    x='salad:%s hamburger:%s water:%s' %(s,h,w)
    return x

但是当我们输入 item_order('water water water') 时,我的程序会打印
salad:0 hamburger:0 water:2

代替
salad:0 hamburger:0 water:3

如果没有两个连续的单词,它工作正常。我该如何纠正?

最佳答案

解决方案

您可以使用 collections.Counter :

from collections import Counter

def item_order(order, items=('salad', 'hamburger', 'water')):
    counter = Counter(order.split())
    return ' '.join(['{}: {}'.format(item, counter.get(item, 0)) for item in items])

print(item_order('water water water'))
print(item_order('water salad, salad'))
print(item_order('water hamburger'))

测试一下:
print(item_order('water water water'))
print(item_order('water salad, salad'))
print(item_order('water hamburger'))

打印:
salad: 0 hamburger: 0 water: 3
salad: 1 hamburger: 0 water: 1
salad: 0 hamburger: 1 water: 1

解释

这些项目作为默认参数给出:
def item_order(order, items=('salad', 'hamburger', 'water')):

这使功能更加灵活,因为您可以根据需要提交其他项目:
def item_order(order, items=('salad', 'fruit', 'water')):

在这里使用元组是有意的,因为可变的默认参数(例如列表)可能会导致意外的副作用。这里没问题,但一般来说可能是花瓶。

将空格处的输入字符串拆分为一个列表后,Counter 将创建一个新的 counter 实例:
counter = Counter(order.split())

例如:
>>> Counter('water water salad'.split())
Counter({'salad': 1, 'water': 2})

最后,列表推导式有助于创建一个新字符串:
' '.join(['{}: {}'.format(item, counter.get(item, 0)) for item in items])
' '.join 使一个新字符串形成一个字符串列表,其中列表元素用空格分隔。例如:
>>> ' '.join(['abc', 'xyz', 'uvw'])
'abc xyz uvw'

Python 字典的 get() 方法如果键在其中则返回键的值,否则返回默认值。例如:
>>> d = {'a': 100, 'b': 200}
>>> d.get('a', 0)
100
>>> d.get('x', 0)
0

将此默认值设置为 0 ,为订单中未包含的项目提供零计数:
counter.get(item, 0))

最后,format() 方法有助于将计数值放入字符串中。例如:
>>> '{}: {}'.format('abc', 10)
'abc: 10'

关于python - Python中的计数和分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34942690/

10-16 01:40