把类的实例分解成列表,或者:一种更好的求和类变量的方法?

2024-09-30 12:33:30 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个项目的一部分,我已经做了一段时间了。我很难用我真正能写的东西来合成心理伪代码,这主要是由于个人对东西如何工作的误解。在

我使用以下类跟踪虚构水果摊的库存:

class Fruit(object)
    def __init__(self,name,qty,price)
        self.color = str(color)
        self.qty = int(qty)
        self.price = float(price)

    def getName(self): return self.color
    def getQty(self): return self.qty
    def getPrice(self): return self.price
    def description(self): return self.color,self.qty,self.price

此类中的对象最终将作为字典键的值导入。每个键可以有多个值,存储在一个列表中,这样在打印字典时,它会返回如下内容(为了可读性,使用换行符:)

^{pr2}$

我现在试图得到我想象中的水果摊上所有水果的总值。我最初的想法是将每个值作为一个列表来处理,在列表中迭代,直到找到一个整数,再将该整数乘以它后面索引中的浮点数,然后将该数量添加到一个有连续总数的变量中;然后继续寻找另一个整数。如果列表“Cherry”的“index 1”不是(Red,5,5.99)而不是(2),那么这将非常有效。在

所以,有几个问题。在

  1. 每次我做这样的事情,我有一个指令式的多个值,这些值都是类对象,每个值都存储为一个附加符号(因为没有更好的方法来调用它)。是应该发生的事情,还是我需要重新评估我正在做的事情的方式,因为我导致了这种情况的发生?

  2. 如果我不需要在这里重新评估我的选择,有没有一种方法可以分解“附加说明”(因为没有更好的东西可以立即出现在脑海中),从而能够将整个事情作为一个列表来对待?

  3. 有没有更好的方法来做我想做的事情,不需要迭代列表?

提前谢谢。一个星期来,我一直在与这个问题的各个部分作斗争。在


Tags: 项目对象方法self列表return字典def
3条回答

我将首先抛弃returnFoo方法,因为键入apple.price的时间更短:

class Fruit(object)
    def __init__(self, name, qty, price)
        self.color = str(color)
        self.qty = int(qty)
        self.price = float(price)

如果不接受qty='100'之类的任意输入,则也不需要类型转换:

^{pr2}$

剩下的就是一个只存储值的类。那样的话,我就用字典:

fruit = {
    'color': 'red',
    'qty': 1000,
    'price': 1.99
}

要计算成本,首先需要水果:

fruits = [{
    'color': 'red',
    'qty': 1000,
    'price': 1.99
}, {
    'color': 'blue',
    'qty': 100,
    'price': 15.99
}, {
    'color': 'orange',
    'qty': 10,
    'price': 5.99
}]

然后您可以使用for循环:

total = 0

for fruit in fruits:
    total += fruit['qty'] * fruit['price']

可以使用sum和生成器表达式进一步简化:

total = sum(fruit['price'] * fruit['qty'] for fruit in fruits)

另一种方法是使用FruitStand类和原始的Fruit类:

class FruitStand(object):
    def __init__(self, fruits=None):
        self.fruits = fruits or []

    def totalCost(self):
        return sum(fruit.price * fruit.qty for fruit in self.fruits)

假设字典是这样的:

fruit_stand = {
    "Lemon": [(Yellow, 5, 2.99)],
    "Apple": [(Red, 10, 0.99), (Green, 9, 0.69)],
    "Cherry": [(White, 2, 5.99),(Red, 5, 5.99)]
}

实际上,您只需遍历字典就可以得到它的键:

^{pr2}$

然后,您可以使用字典的items方法来获得keyvalue对的元组(您称之为“插入式”):

for fruit_name, fruits in fruit_stand.items():
    print fruit_name, "=>", fruits

# Lemon => [(Yellow, 5, 2.99)]
# Apple => [(Red, 10, 0.99), (Green, 9, 0.69)]
# Cherry => [(White, 2, 5.99),(Red, 5, 5.99)]

lists(括号内的[])也是可编辑的:

for fruit in [(White, 2, 5.99),(Red, 5, 5.99)]:
    print fruit

# (White, 2, 5.99)
# (Red, 5, 5.99)

因此,我们可以使用每个fruits列表来访问我们的tuple

for fruit_name, fruit_list in fruit_stand.items():
    # Ignore fruit_name and iterate over the fruits in fruit_list
    for fruit in fruit_list:
        print fruit

正如我们在items中看到的,我们可以将元组解压为多个值:

x, y = (1, 2)
print x
print y
# 1
# 2

因此,我们可以将每个fruit解压为其组成部分:

for fruit_name, fruit_list in fruit_stand.items():
    # Ignore fruit_name and iterate over the fruits in fruit_list
    for color, quantity, cost in fruit_list:
        print color, quantity, cost

然后得到总数并不难:

# We need to store our value somewhere
total_value = 0
for fruit_name, fruit_list in fruit_stand.items():
    # Ignore fruit_name and iterate over the fruits in fruit_list
    for color, quantity, cost in fruit_list:
        total_value += (quantity * cost)

print total_value

尽管如此,有很多更清晰的做事方式:

  1. 您可以使用列表理解来简化for循环:

    for fruit_name in fruit_stand
        operation(fruit_name)
    

    可以翻译为以下列表理解:

    [operation(fruit_name) for fruit_name in fruit_stand]
    

    因此,我们可以将嵌套的for循环转换为:

    sum([cost * quantity \  # Final operation goes in front
        for _, fruits in fruit_stand.items() \
            for _, cost, quantity in fruits])
    

    因为我们实际上不需要列表,所以我们可以去掉它,而Python将为我们创建一个生成器:

    sum(cost * quantity \  # Note the missing []
        for _, fruits in fruit_stand.items() \
            for _, cost, quantity in fruits)
    
  2. 您可以将__add__方法添加到Fruit中,这样将两组水果一起添加在一起就可以得到这两组Fruit的总成本(但是您可能需要创建一个中间数据结构来完成此操作,例如Basket,因此Fruit不必担心实际上不属于{}的{},保存的意义是Fruit的任何实例都有内在量1。我省略了这个选项的代码,因为这个答案已经太长了。

您要查找的单词是"tuple"。这些“附加说明”是tuples。在

Python的一个主要优点是它用于迭代列表的紧凑语法。您可以计算一行中每种水果的价格总和:

>>> fruit = [("Red", 10, 0.99), ("Green", 9, 0.69)]
>>> sum(qty * price for color, qty, price in fruit)
16.11

分解它,sum()中的内容称为generator expressionfor color, qty, price in fruit遍历fruit,并将元组解压为三个命名变量。然后可以在for的左侧使用这些变量。对于fruit列表中的每个元组,生成器表达式计算qty * price。在

如果将此表达式放在方括号内,它将变成list comprehension,并允许您查看计算值。在

^{pr2}$

相关问题 更多 >

    热门问题