在循环中创建类实例并更新i

2024-06-17 13:40:44 发布

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

假设我有一个数据集测试.csv)就像这样:

Name,Fruit,Price
John,Apple,1.00
Steve,Apple,1.00
John,Mango,2.00
Adam,Apple,1.00
Steve,Banana,1.00

尽管有几种更简单的方法可以做到这一点,但我还是想用python将这些信息组织成一个类。因此,理想情况下,类的实例如下所示:

{'name': 'John', 'Fruits': ['Apple','Mango'], 'Price':[1.00, 2.00]}

我将数据集加载到类中的方法是将每个实例存储在一个列表中。你知道吗

class org(object):
    def __init__(self,name,fruit,price):
        self.name = name
        self.fruit = [fruit]
        self.price = [price]

    classes = []
    with open('test.csv') as f:
        for line in f:
            if not 'Name' in line:
                linesp=line.rstrip().split(',')
                name = linesp[0]
                fruit = linesp[1]
                price = linesp[2]
                inst = org(name,fruit,price)
                classes.append(inst)
    for c in classes:
        print (c.__dict__)
  1. 在这种情况下,如何知道“John”是否已经作为实例存在?

  2. 如果是,如何更新“John”?用classmethod?

@classmethod
    def update(cls, value):
        cls.fruit.append(fruit)

Tags: csv数据实例nameinselfappleline
1条回答
网友
1楼 · 发布于 2024-06-17 13:40:44

不需要任何特殊的东西来更新实例。类的属性是公共的,所以只需访问它们进行更新。你知道吗

如果您坚持使用列表作为实例容器,您可以这样做:

classes = []
with open('test.csv') as f:
    for line in f:
        if not 'Name' in line:
            name,fruit,price=line.rstrip().split(',')
            exists = [inst for inst in classes if inst.name == name]
            if exists:
                exists[0].fruit.append(fruit)
                exists[0].price.append(price)
            else:
                classes.append(org(name,fruit,price))
for c in classes:
    print (c.__dict__)

但是,我建议改用dict,因为它使查找和访问实例更容易

classes = {}
with open('test.csv') as f:
    for line in f:
        if not 'Name' in line:
            name,fruit,price=line.rstrip().split(',')
            if name in classes:
                classes.get(name).fruit.append(fruit)
                classes.get(name).price.append(price)
            else:
                classes.update({name: org(name,fruit,price)})

for c in classes.values():
    print (c.__dict__)

这两种解决方案将为您提供相同的结果:

{'name': 'John', 'fruit': ['Apple', 'Mango'], 'price': ['1.00', '2.00']}
{'name': 'Steve', 'fruit': ['Apple', 'Banana'], 'price': ['1.00', '1.00']}
{'name': 'Adam', 'fruit': ['Apple'], 'price': ['1.00']}

为了完整起见,下面的注释中@madpysicalist更新dict的笨拙方式可能意味着我使用dict的方法,而不是通过订阅访问条目。你知道吗

# update existing instance in the dict
classes[name].fruit.append(fruit)

# add new instance to the dict
classes[name] = org(name, fruit, price)

我个人觉得这有点难看,所以我倾向于使用以下方法:)

相关问题 更多 >