gpt4 book ai didi

python - 将类的实例分解为列表,或 : a better way to sum class variables?

转载 作者:太空宇宙 更新时间:2023-11-03 12:40:45 25 4
gpt4 key购买 nike

这是我已经进行了一段时间的项目的一部分。我很难将心理伪代码与我实际可以编写的东西相结合,这主要是由于个人对这些东西是如何工作的误解。

我正在使用以下类跟踪假想水果摊的库存:

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

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

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

我现在正在尝试最终获得我想象中的水果摊上所有水果的总值(value)。我最初的想法只是将每个值视为一个列表,遍历列表直到我找到一个整数,将该整数乘以它后面索引中的 float ,然后将该数量添加到一个具有运行总计的变量中;然后继续寻找另一个整数。如果列表“Cherry”的“索引 1”不是 (Red, 5, 5.99) 而不是 (2),这会很好用。

所以,有几个问题。

  1. 每次我做这样的事情时,我有一个包含多个值的字典,这些值都是类对象,每个值都存储为括号(因为缺少更好的称呼。)那应该发生,还是我需要重新评估我正在做的事情的方式,因为我导致了那件事发生?

  2. 如果我不需要在这里重新评估我的选择,有没有办法分解“括号”(因为缺少更好的东西来立即想到它们)能够把整个事情当作一个列表?

  3. 有没有更好的方法来完成我想做的事情而不涉及遍历列表?

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

最佳答案

假设字典是这样的:

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)]
}

你实际上可以遍历字典来获取它的键:

for fruit_name in fruit_stand:
print fruit_name

# Lemon
# Apple
# Cherry
# NOTE: Order not guaranteed
# Cherry, Lemon, Apple are equally likely

然后,您可以使用字典的 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)]

list(即方括号中的 [])也是可迭代的:

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. 您可以向 Fruit 添加一个 __add__ 方法,以便将两组水果加在一起得到两组 Fruit< 的总成本(但您可能希望创建一个中间数据结构来执行此操作,例如 Basket,这样 Fruit 就不必担心数量 并不真正属于 Fruit,从某种意义上说,Fruit 的任何实例都具有内在数量 1。我省略了此选项的代码,因为这个答案已经太长了。

关于python - 将类的实例分解为列表,或 : a better way to sum class variables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16311369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com