我有很多对象(可以使用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]
我了解我需要某种遍历列表的循环(尽管有很多方法,但我不确定哪种方法可行),但是如何引用列表中对象的值呢?就像“如果性别=女孩,请删除项目”
答案 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)
当然,还有许多其他方法可以实现。