我有一个非常大的对象列表(你可以用类做的东西,对吧?)我想要遍历这个列表,如果对象具有特定值,则将其删除。然后,我将使用排序列表来挑选随机元素,并将它们用于其他用途。
我应该使用字典、数组或其他东西而不是对象和列表吗?我对此非常陌生,如果它非常简单或者我做错了什么,我很抱歉。
示例:
class Person:
def __init__(self, name, gender, otherVar, otherVar2):
self.name = name
self.gender = gender
self.otherVar = otherVar
self.otherVar2 = otherVar2
## also more variables if that makes a difference
John = Person("John", boy, otherVar, otherVar2)
Jane = Person("Jane", girl, otherVar, otherVar2) ## etcetera
myList = [John, Jane, Mary, Derek, Bob, Sue]
simpleThingThatIdoNotUnderstand(): ## removes all the
## girls
myList = [John, Derek, Bob]
我知道我需要在列表中进行某种循环(虽然有很多方法,但我不确定哪种方法有效),但是我如何引用列表中对象的值呢?就像‘如果性别=女孩,删除项目’
发布于 2018-10-23 07:44:54
有几种方法可以做到这一点,一些比其他方法更快或更少的代码。
最简单的方法是遍历整个列表,检查该项目是否与某些条件匹配,然后删除该项目。尤其是因为您将一个条件应用于您的整个人员集合。
在您的示例中,可能如下所示:
# removes all people of the specified gender
def removePeopleByGender(people, gender):
output = []
for person in people:
# assumes person.gender and gender are the same data type
if (person.gender != gender):
output.append(person)
return output
通常,字典是(键,值)配对的首选,在这种配对中,您将拥有一组键或一个特定的键,并试图进行快速查找。它们针对查找O(1)进行了大量优化,但使用了更多的内存。
发布于 2018-10-23 07:45:09
这将生成一个新的男孩列表:
boys = [person for person in myList if person.gender == boy]
最好是创建一个新的列表,而不是尝试从列表中删除对象。
发布于 2018-10-23 07:47:09
单独使用经典的for item in list:
循环并不能达到这个目的,因为您不能从该循环中的列表中删除元素。
首先,a会说你定义了一个函数,它接受一个人,如果它应该留在列表中,则返回true,如果应该删除,则返回false。假设您将该函数命名为keep_person。在此之后,您可以使用以下方法之一:
使用过滤功能(推荐):
myList = filter(keep_person, myList)
或者这样,如果您更喜欢好的旧循环:
people_to_remove = []
for person in myList:
if not keep_person(person):
people_to_remove.append(person)
for person in people_to_remove:
myList.remove(person)
当然,还有很多其他的方法。
https://stackoverflow.com/questions/52939070
复制相似问题