我正在寻找一个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)
答案 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]