You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:03:23