Python-未知大小的2D列表

时间:2019-07-17 13:40:44

标签: python python-3.x

我正在寻找一个2D列表来存储数据。n,我想在各种信息旁边存储一个自动递增的ID。所需的行数未知,但是列数始终固定为6个数据值。

我想要类似以下的内容:

[0, a, b, 1, 2, 3]
[1, c, d, 4, 5, 6]
[2, e, f, 7, 8, 9]

然后,我希望能够根据需要返回任何列,例如

[a, c, e]

目前,我正在尝试以下代码:

    student_array = []
    student_count = 0
    ...
    Student.student_array.append(Student.student_count)
    Student.student_array.append(name)
    Student.student_array.append(course_name)
    Student.student_array.append(mark_one)
    Student.student_array.append(mark_two)
    Student.student_array.append(mark_three)
    Student.student_count = Student.student_count + 1

def list_students():
    print(Student.student_array[1])

我目前遇到的问题是,显然是将新行添加到外部列表的末尾,而不是添加新行。即:

[0, 'a', 'b', 1, 2, 3, 1, 'c', 'd', 4, 5, 6]

另外,从每一行中拉出第二列时,代码也会遵循以下几行:

column_array = []
for row in Student.student_array:
    column_array.append(row[2])
print("Selected Data =", column_array)

1 个答案:

答案 0 :(得分:2)

您现在拥有的结构将所有数据都存储在一个列表中(列表和数组在Python中意味着不同的事情),实际上使获取列更加容易。如果您的记录大小为r_len = 6,并且您想要col = 3(第四列),则可以

>>> Student.student_array[col::r_len]
[1, 4, 7]

不过,要存储2D列表,您需要将每个学生的信息放入循环中的单独列表中:

current_student = [len(Student.student_array), name, course_name, mark1, mark2, mark3]
Student.student_array.append(current_student)

请注意,您无需这样维护单独的计数:外部列表的长度说明了一切。

要从col = 3的二维数组中获取数据,请使用以下理解:

>>> [s[col] for s in Student.student_array]
[1, 4, 7]

以这样的无标签格式保留相关信息通常不是一个好主意。您可以使用类似pandas的库来添加标签,该库将为您维护正确的表,或者您可以将每个学生的信息封装到一个小类中。您可以编写自己的类,或使用类似namedtuple的类:

Record = collections.namedtuple('Record', ['id', 'name', 'course', 'mark1', 'mark2', 'mark3'])

...

Student.student_array.append(Record(len(Student.student_array), name, course_name, mark1, mark2, mark3))

您现在可以为每个学生提取mark1而不是数字索引,因为数字索引可能会更改并在以后引起维护问题:

>>> [s.mark1 for s in Student.student_array]
[1, 4, 7]