要从列表中删除对象吗?

时间:2019-12-28 03:11:16

标签: python csv sorting object del

因此,我仍然是一名初学者程序员,负责对由csv文件创建的具有lname,fname,性别,年龄(按此顺序)属性的对象进行排序,并按lname属性对其进行排序。我已经实现了这一点,但是现在我需要删除其中一个对象(我选择了一个随机对象进行测试),这就是我到目前为止所拥有的:

class FitClinic:
    def __init__(self, lname, fname, gender, age):
        self.lname = lname
        self.fname = fname
        self.gender = gender
        self.age = int(age)

    def __del__(self):
        print("Customer has been deleted")

    def get_lname(self):
        return self.lname

    def get_fname(self):
        return self.fname

    def get_gender(self):
        return self.gender

    def get_age(self):
        return self.age

fh=open('fit_clinic_20.csv', 'r')
fh.seek(3)
listofcustomers=[]
for row in fh:
    c = row.split(",")
    listofcustomers.append(FitClinic(c[0], c[1], c[2], c[3]))

sorted_list=sorted(listofcustomers,key=lambda x: x.get_lname())

for x in sorted_list:
    if x.get_lname()==("Appleton"):
        del x
    print(x.get_lname(),x.get_fname(),x.get_gender(),x.get_age())

现在它显然不起作用,我需要一些帮助。

4 个答案:

答案 0 :(得分:4)

del x仅删除临时变量x,它对列表没有影响。您需要使用del listofcustomers[pos],但首先必须在列表中找到位置。

try:
    pos = next(i for i,v in enumerate(listofcustomers) if v.get_lname() == "Appleton")
    del listofcustomers[pos]
except StopIteration:
    pass // Ignore if not found

有关查找符合条件的元素的索引的多种方法,请参见Python: return the index of the first element of a list which makes a passed function true

答案 1 :(得分:1)

此示例对于filter更好,因为它删除了lnameAppleton的所有诊所:

sorted_list = list(filter(lambda c: c.get_lname() != "Appleton", sorted_list))

如果只想删除第一个,请使用Barmar's answer

这与列表理解相同,Python更擅长优化:

sorted_list = [c for c in sorted_list if c.get_lname() != "Appleton"]

答案 2 :(得分:1)

您可以使用列表理解功能从列表中删除项目:

sorted_list[:] = [x for x in sorted_list if not(x.get_lname()==("Appleton"))]

一个工作示例:

class FitClinic:
    def __init__(self, lname):
        self.lname = lname

    def __del__(self):
        print("Customer has been deleted")

    def get_lname(self):
        return self.lname

# Create example
sorted_list = [FitClinic('a'), FitClinic('b'), FitClinic('c'), FitClinic('Appleton')]
sorted_list[:] = [x for x in sorted_list if not(x.get_lname()=="Appleton")]

现在sorted_list是。

a
b
c

答案 3 :(得分:1)

只需尝试:

for x in sorted_list:  # Loops through Customers in List
    if x.get_lname() == "Appleton":  # Check if the last name is Apple
        sorted_list.remove(x)  # Remove each from the list, Pretty self explanatory
    else:  # you only want to print if the last name is not APppleton
        print(x.get_lname(), x.get_fname(), x.get_gender(), x.get_age())

.remove从列表中删除对象,因此您无需跟踪循环的索引。 阅读this w3schools教程以了解更多列表操作