我们说我有一个数据集(' test.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__)
在这种情况下,我怎么知道John'已作为实例存在?
如果是这样,我该如何更新' John'?用classmethod?
@classmethod
def update(cls, value):
cls.fruit.append(fruit)
答案 0 :(得分:2)
更新您的实例不需要任何特殊内容。您的类属性是公共的,因此只需访问它们即可进行更新。
如果你坚持使用列表作为实例容器,你可以做某事。像这样:
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']}
为了完整起见,评论中下面的@MadPhysicist可能意味着更新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)
我个人觉得有点难看,因此我倾向于使用这些方法:)