从 Python 中的数组初始化实例列表

Initialize a list of instances from an array in Python

我是 Python 的新手,所以这个问题的答案可能很简单。我以前在里面做过一些编码,但我忘记了大部分。

我有一个值列表,我从这样的文件中获得:

podela = fobj.read().split()

有 10 个值作为一个整体代表一些数据。这 10 个值重复 N 次。因此,Nx10 值全部在一起。只有一些值(10 个中的 4 个)用于创建以下 class.

的实例

我有一个代表时间的class:

class Vreme:
    day = 0
    hour = 0
    minute = 0
    second = 0

    def __init__(self, day, hour, minute, second):
        self.day = day
        self.hour = hour
        self.minute = minute
        self.second = second
    def __init__(self):
        self.day = 0
        self.hour = 0
        self.minute = 0
        self.second = 0

    def toString(self):
        s = repr(self.day)+'-'+repr(self.hour)+':'+repr(self.minute)+':'+repr(self.second)
        return s

    def print(self):
        s = self.toString()
        print(s)

如何使用列表 podela 实例化 Vreme 的实例列表?

EDIT1:podela 保存值,这些值是字符串格式的十六进制表示。

部分文件示例,4xlines:

4a 02 f6 01 00 04 0e 08 03 00
4a 02 f6 01 00 04 0e 08 04 00
49 02 f6 01 00 04 0e 08 04 00
49 02 f5 01 00 04 0e 08 04 00
4a 02 f6 01 00 04 0e 08 05 00

拆分后的波德拉,最后几个值:

'0e', '12', '1f', '00', '49', '02', 'f4', '01', '00', '04', '0e', '12', '20', '00', '49', '02', 'f5', '01', '00', '04', '0e', '12', '20', '00', '48', '02', 'f4', '01', '00', '04', '0e', '12', '20', '00', '4a', '02', 'f4', '01', '00', '04', '0e', '12', '21', '00', '49', '02', 'f5', '01', '00', '04', '0e', '12', '21', '00', '4a', '02', 'f5', '01', '00', '04', '0e', '12', '22', '00', '49', '02', 'f5', '01', '00', '04', '0e', '12', '22', '00', '48', '02', 'f4', '01', '00', '04', '0e', '12', '22', '00', '4a', '02', 'f6', '01', '00', '04', '0e', '12', '23', '00', '48', '02', 'f4', '01', '00', '04', '0e', '12', '23', '00']

输入文件(为 podela 拆分)为 56kB,但这是一个测试文件。实际文件将是 5MB+

EDIT2:输入输出示例 示例是一个非常小的文件,它包含 3x10 个值。

该文件包含这些值:

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

制作 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]

假设我将位置 0、2、4 和 8 的值用于构造函数。 vreme 应该是 3 个 Vreme 实例的列表:

vreme[0] = 00 00 00 00
vreme[1] = 01 03 05 07
vreme[2] = 11 11 11 11

首先,我建议将您的两个初始化函数合并为一个函数,如下所示:

class Vreme:
    day = 0
    hour = 0
    minute = 0
    second = 0

    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 = repr(self.day)+'-'+repr(self.hour)+':'+repr(self.minute)+':'+repr(self.second)
        return s

    def print(self):
        s = self.toString()
        print(s)

那么你可以实例化为:

vreme = Vreme(*podela[:4])

假设您想要 podela 的前 4 个元素

示例:

podela = [1, 2, 3, 4, 5, 6]
vreme = Vreme(*podela[:4])

print(vreme.day)
# 1

print(vreme.hour)
# 2

print(vreme.minute)
# 3

print(vreme.second)
# 4

也许你可以 append 它们在 for 循环中

vreme_instances = []
for i in podela:
    vreme_instances.append(Vreme(i[0], i[2], i[4], i[8]))  
    # change indexes at the line above as you need

假设 podela 是这样的元组列表:

podela = [(4, 12, 32, 54), (16, 20, 12, 32)]
# [(day, hour, minute, second),]

编辑

要达到上面的效果,首先要改变这个

podela = fobj.read().split()

到这个

lines = fobj.read().splitlines()     # first: split input file into lines
podela = [x.split() for x in lines]  # second: split every line to values

这将为您提供 list 个 N 个子列表:

[
    ['4a', '02', 'f6', '01', '00', '04', '0e', '08', '03', '00'], 
    ['4a', '02', 'f6', '01', '00', '04', '0e', '08', '04', '00'], 
    ['49', '02', 'f6', '01', '00', '04', '0e', '08', '04', '00'], 
    ['49', '02', 'f5', '01', '00', '04', '0e', '08', '04', '00'],
]

每个子列表代表一个 Vreme 个实例。