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

时间:2018-10-22 23:34:48

标签: python

我有很多对象(可以使用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]

我了解我需要某种遍历列表的循环(尽管有很多方法,但我不确定哪种方法可行),但是如何引用列表中对象的值呢?就像“如果性别=女孩,请删除项目”

4 个答案:

答案 0 :(得分:1)

有几种方法可以执行此操作,某些方法比其他方法更快或更短。

最简单的方法是遍历整个列表,检查项目是否符合某些条件,然后删除该项目。特别是因为您要对整个人施加条件。

在您的示例中,它可能类似于:

# 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)进行了优化,但使用了更多的内存。

答案 1 :(得分:0)

这将列出一个新的男孩列表:

boys = [person for person in myList if person.gender == boy]

最好创建一个新列表,而不是尝试从列表中删除对象。

答案 2 :(得分:0)

有几种不同的方法可以执行此操作,具体取决于您要对符合条件的项目(在这种情况下,是与女孩相对应的对象)进行处理。给定您要开始的列表:

myList = [John, Jane, Mary, Derek, Bob, Sue]

最直接的方法是建立另一个仅包含女孩的列表。有一种称为列表理解的结构非常适合此目的:

new_list = [<expression> for <variable> in <original_list> if <condition>]

此操作是遍历<original_list>的每个元素,将<variable>临时设置为该元素,测试<condition>以查看是否为真,如果是,则评估{{1 }}并将其放在新列表中。它与以下代码完全相同:

<expression>

除了更紧凑的代码之外,有经验的Python程序员更容易阅读。

在您的情况下:

  • new_list = [] for <variable> in <original_list>: if <condition>: new_list.append(<expression>) <original_list>
  • myList可以是任何Python标识符;假设<variable>
  • person将是真的,如果该人是女孩,这意味着<condition>
  • person.gender == girl本身就是<expression>,因为您只想要原始列表中的同一对象,而不是它的某些属性或功能或类似的东西

我将留给您将这些组件替换为原始列表理解。

答案 3 :(得分:0)

仅使用经典的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)

当然,还有许多其他方法可以实现。