Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表生成对象_Python_File_Object - Fatal编程技术网

Python 从列表生成对象

Python 从列表生成对象,python,file,object,Python,File,Object,我有一个程序,可以从文本文件中读取行,每行包含一个单词,如价格或产品名称。程序读取所有行并将每个单词保存在列表中。文件中的每个产品都包含三行,分别是:产品名称、价格和重量。因此,列表中的内容如下所示: ['Mjölk'、'15kr'、'1l'、'Köttfärs'、'80kr'、'1kg'、'Morötter'、'20kr'、'1kg'] 现在我们来讨论这个问题,我有一节课: class Produkt: def __init__(self, produkt, pris, vikt):

我有一个程序,可以从文本文件中读取行,每行包含一个单词,如价格或产品名称。程序读取所有行并将每个单词保存在列表中。文件中的每个产品都包含三行,分别是:产品名称、价格和重量。因此,列表中的内容如下所示: ['Mjölk'、'15kr'、'1l'、'Köttfärs'、'80kr'、'1kg'、'Morötter'、'20kr'、'1kg']

现在我们来讨论这个问题,我有一节课:

class Produkt:
def __init__(self, produkt, pris, vikt):
    self.produkt = produkt
    self.pris = pris
    self.vikt = vikt
我想从列表中的项目生成Produkt对象,但我不知道如何循环列表中的项目,然后将它们保存为对象。 我在想我应该列一张物品清单,然后像: 对于Produkts列表中的项目: append(Produkt(item,item,item))


但这显然不起作用,有人知道如何做到这一点吗?

如果您想循环,请尝试

For x in range(0 , 3):
您可以根据需要的迭代次数更改这三个参数。该示例将进行3次迭代

for i in range(len(listofprodukts)//3): #use xrange if it's python2
                                        #// -> floor division. Will silently chop off excess if len(listofprodukts) isn't a multiple of 3
    #print(listofprodukts[3*x:3*(x+1)]) # this expression makes chunks of three. Uncomment me to see :P
    objectlits.append(Produkt(*listofprodukts[3*x:3*(x+1)])) 
                      #       ^This * is for argument unpacking
我习惯于把你的名单分成三人一组。因为我很懒,我用它来把它们输入你的对象创建者

Admendum:我同意这一点,如果你要做这类事情,进行一些验证会很有用

我个人会把它放在模型里,但那只是我

class Produkt:
    def __init__(self, produkt, pris, vikt):
        if not pris.endswith('kr'):
             raise ValueError("Invalid price {}. Prices should be in kr".format(pris)) 
            #raise ValueError, "Prices ..etc" for python 2
        self.produkt = produkt
        self.pris = pris
        self.vikt = vikt

假设这三个属性的顺序一致,您只需每隔三个索引迭代一次,然后对列表进行切片:

class Produkt:
    def __init__(self, produkt, pris, vikt):
        self.produkt = produkt
        self.pris = pris
        self.vikt = vikt

lst =  ['Mjölk', '15 kr', '1 liter', 'Köttfärs', '80 kr', '1 kg', 'Morötter', '20 kr', '1 kg']

produkts = []
for i in xrange(0,len(lst),3):  #in python 3.x use range() instead
    produkts.append(Produkt(lst[i], lst[i+1], lst[i+2]))

假设属性顺序是一致的

text_list=['Mjolk','15kr','1l','Kottfers','80kr','1kg','Morotter','20kr','1kg']

产品类别: definit(自身、产品、pris、vikt): self.produkt=produkt self.pris=pris self.vikt=vikt

##make a representation of the Produkt object so we can verify we're getting what we want
def __repr__(self):
    return_string = "|{}, {}, {}|".format(self.produkt, self.pris, self.vikt)
    return(return_string)
object_list=[]创建一个空的对象列表 index=0##创建一个索引变量并将其设置为0

循环从文本文件中删除的列表 索引
打印(对象列表)##打印列表对象以确保我们拥有所需的内容

谢谢,但这对我想做的事情没有帮助。我需要第一个循环中的前三个值,我如何才能做到?可能与范围(0,10)中的x类似:Produkt(list[x],list[x+1],list[x+2]),这对第一个对象有效,但随后会出现问题。对于
range()
xrange()
range(stop)
range(start,stop[step])
这将简单地给出第一个产品集。按三步进似乎比按1步进然后再乘以更清晰。但在任何一种情况下,您都可能希望添加“if not lst[i+1].endswith('kr'):raise ValueError()”或类似的测试,因为数据迟早会被破坏(例如,有人编辑它以更新某些内容,并意外插入或删除了一行),你会想马上知道的。顺便说一句,这是完成我想要做的事情的好方法吗?像那样逐行阅读,还是有更好的方法?比如对produkts使用关键字之类的。你介意解释一下3*x:3*(x+1)的作用吗?它从produkts列表中创建了第x个三个片段。对于第一次迭代:
x=0
[3*0:3*(0+1)]=[0:3]
然后对于
x=1
[3*1:3*(1+1)]=[3:6]
等等……列表切片:从索引
3*x
到索引
3*(x+1)-1
。看,是的,这也起了作用,不过更简单的说法是:虽然index##make a representation of the Produkt object so we can verify we're getting what we want def __repr__(self): return_string = "|{}, {}, {}|".format(self.produkt, self.pris, self.vikt) return(return_string)
##Use the index to get this Produkt's produkt, pris, and vikt
produkt = text_list[index]
pris = text_list[index+1]
vikt = text_list[index+2]

##Create the new Produkt object
new_product = Produkt(produkt, pris, vikt)

##add the new product to the object list
object_list.append(new_product)

##Set the index to the next produkt in the list
index += 3