如何在Python中从数组初始化Vreme类的实例列表?
首先得提一下你的Vreme类里的小问题——你定义了两个__init__方法,Python里后面的会把前面的覆盖掉,这样你没法直接用带参数的构造函数来创建实例。先把这个类修正一下,改成带默认参数的构造方法,这样既支持无参初始化,也支持传参数:
class Vreme: def __init__(self, day=0, hour=0, minute=0, second=0): self.day = day self.hour = hour self.minute = minute self.second = second def toString(self): s = f"{self.day}-{self.hour}:{self.minute}:{self.second}" return s def print(self): print(self.toString())
(顺便把toString里的repr换成f-string,更简洁易读)
接下来,我们一步步处理podela列表生成Vreme实例列表:
1. 分组处理podela
你的podela是每10个元素一组,我们可以用range按步长10遍历索引,每次取出一组数据。
2. 提取指定位置的元素并转成整数
因为podela里的是十六进制字符串,所以要用int(hex_str, 16)转成十进制整数。假设你要取每组的第0、2、4、8位索引(对应你的输入输出示例),这四个位置就是我们需要的day、hour、minute、second参数。
3. 生成实例列表
把每一组处理后的参数传给Vreme,收集到列表里即可。
完整代码示例
# 修正后的Vreme类 class Vreme: def __init__(self, day=0, hour=0, minute=0, second=0): self.day = day self.hour = hour self.minute = minute self.second = second def toString(self): s = f"{self.day}-{self.hour}:{self.minute}:{self.second}" return s def print(self): print(self.toString()) # 假设你已经读取到podela列表 # podela = fobj.read().split() # 定义要提取的每组中的索引位置(可根据需求调整) indices_to_extract = [0, 2, 4, 8] # 生成Vreme实例列表 vreme_list = [] # 按每10个元素一组遍历 for i in range(0, len(podela), 10): # 取出当前组的10个元素 group = podela[i:i+10] # 提取指定索引的元素,转成十六进制整数 day = int(group[indices_to_extract[0]], 16) hour = int(group[indices_to_extract[1]], 16) minute = int(group[indices_to_extract[2]], 16) second = int(group[indices_to_extract[3]], 16) # 实例化Vreme并加入列表 vreme_instance = Vreme(day, hour, minute, second) vreme_list.append(vreme_instance)
针对大文件的优化
你的实际文件是5MB以上,上面的方法已经足够高效了——split()会一次性把所有内容读到内存里,但5MB的文本内存占用不会太大(大概几十MB以内,完全没问题)。如果文件特别大(比如几十GB),可以考虑逐行读取并处理,但5MB的话完全没必要,上面的方法就够了。
测试你的示例输入
用你给的测试podela:
podela = ['00','00','00','00','00','00','00','00','00','00','01','02','03','04','05','06','07','08','09','10','11','11','11','11','11','11','11','11','11','11']
运行代码后,vreme_list里的三个实例:
vreme_list[0].toString()→"0-0:0:0"(十六进制00转十进制是0)vreme_list[1].toString()→"1-3:5:9"(01→1,03→3,05→5,09→9)vreme_list[2].toString()→"17-17:17:17"(十六进制11转十进制是17)
和你描述的预期一致(你示例里写的vreme[1]是01 03 05 07应该是笔误,按你说的第8位是09,所以转成9)。
如果需要调整提取的索引,只需要修改indices_to_extract列表就可以了,比如要取其他位置,直接改里面的数字就行。
内容的提问来源于stack exchange,提问作者Invader Zim

