繁体   English   中英

如何从列表中删除某些值的对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM