[英]How do I remove objects of certain values from a list?
我有很多对象(您可以使用Classes做的事情,是吗?)。 我想浏览此列表并删除具有特定值的对象。 然后,我将使用排序后的列表来挑选随机元素,并将其用于其他用途。
我应该使用字典还是数组或其他东西代替对象和列表? 我对此很陌生,很抱歉,如果它很简单,或者我做错了什么。
例:
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]
我知道我需要某种遍历列表的循环(尽管有很多方法,但我不确定哪种方法会起作用),但是如何引用列表中对象的值呢? 就像“如果性别=女孩,请删除项目”
您可以通过几种方法来执行此操作,而某些方法则比其他方法更快或更短。
最简单的方法是遍历整个列表,检查项目是否符合某些条件,然后删除该项目。 特别是因为您要对整个人施加条件。
在您的示例中,这可能类似于:
# 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)进行了优化,但使用了更多的内存。
这将列出新的男孩:
boys = [person for person in myList if person.gender == boy]
最好创建一个新列表,而不是尝试从列表中删除对象。
有几种不同的方法可以执行此操作,具体取决于您想对符合条件的项目(在这种情况下,与女孩相对应的对象)进行处理。 给定您要开始的列表:
myList = [John, Jane, Mary, Derek, Bob, Sue]
最直接的方法是建立另一个仅包含女孩的列表。 有一种称为列表理解的结构非常适合此目的:
new_list = [<expression> for <variable> in <original_list> if <condition>]
这样做是通过<original_list>
每个元素,将<variable>
临时设置为该元素,测试<condition>
以查看其是否为真,如果是,它将评估<expression>
并将其放入新列表中。 它与以下代码完全相同:
new_list = []
for <variable> in <original_list>:
if <condition>:
new_list.append(<expression>)
除了更紧凑的代码之外,有经验的Python程序员更容易阅读。
在您的情况下:
<original_list>
是myList
<variable>
可以是任何Python标识符; 假设person
<condition>
将为真,这意味着person.gender == girl
<expression>
只是person
本身,因为您只想要原始列表中的相同对象,而不是它的某些属性或功能或类似的东西 我将把这些组件代入原始列表推导中。
使用经典for item in list:
无法解决问题,因为您无法从该循环内的列表中删除元素。
首先,您会说您定义了一个接受Person的函数,如果应该保留在列表中,则返回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)
当然,还有许多其他方法可以做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.