我对一般的编码和Python非常环保,我正在尝试动态学习它,所以我为任何绿色错误提前道歉。我的目标是读取CSV文件并对数据进行排序。我认为使用课程是最好的,但我可能是错的。 CSV文件的格式如下。
A,1,2,3
B,3,2,1
C,2,1,3
D,2,3,1
E,1,3,2
F,3,1,2
每一行都是一个新项目,第一个字母是名称,数字是我想要对字母进行排序的数字。实际数据会有所不同,例如名称不仅仅是一个字母,但格式不会改变。我无法弄清楚如何应用我制作的课程并对其进行排序。到目前为止,这是我的代码:
class art:
def __init__(self, name, c1, c2, c3):
self.name = name
self.c1 = c1
self.c2 = c2
self.c3 = c3
def __repr__(self):
return repr((self.name, self.c1, self.c2, self.c3))
data = open('c:/tempdata/test_sort_data.csv', 'r')
f = data.read()
print f
我打算使用像这样的排序函数:
sorted(f, key=lambda art: art.c1)
我只是使用print f
检查并确保数据已正确读取。当我完成时,我只想打印排序列表。我最终想要使用多个参数运行更复杂的排序,所有三个数字,但我现在无法弄清楚如何对它进行排序。我不知道如何调用它,因为我不知道如何将数据格式化为班级。我也不坚持使用课程,这似乎是目前最干净的方式。任何帮助都会有所帮助。
答案 0 :(得分:0)
要将每一行转换为Art
实例(注意类名的大写约定),您可以这样做:
instances = []
with open('c:/tempdata/test_sort_data.csv') as data:
for line in data:
name, c1, c2, c3 = line.strip().split(",")
c1, c2, c3 = map(int, (c1, c2, c3))
instances.append(Art(name, c1, c2, c3))
在排序方面,您可以实施比较"魔术方法"在你班上:
class Art:
...
def __eq__(self, other):
return self.c1 == other.c1
def __lt__(self, other):
return self.c1 < other.c1
现在您可以使用sorted(instances)
。
答案 1 :(得分:0)
在这种情况下使用类只有在除了保存数据和对csv文件中的行进行排序之外还要做其他事情才有意义。例如,您可以在不使用类的情况下将数据排序为几行:
import csv
with open("data.csv", "r") as csv_file:
data = [line for line in csv.reader(csv_file)]
data.sort(key=lambda entry: entry[1])
但是如果您需要一种更复杂的方式对条目进行排序,那么您可以在data.sort
方法中定义要使用的特定函数,而不是使用lambda
表达式。
如果你没有做任何事情而不是用数据排序,那么我会说你不需要经历定义一个类的“麻烦”。