[英]Python, how to check object is in list?
我有一个对象来存储数据:
Vertex(key, children)
以及存储此对象的列表
vertices = []
我正在使用另一个列表
key_vertices = []
存储顶点的关键点,以便每次需要检查具有此类关键点的顶点时都可以轻松访问(不循环每个对象),例如:
if key not in self.key_vertices:
# add a new key to the array
self.key_vertices.append(key)
# create a vertex object to store dependency information
self.verteces.append(Vertex(key, children))
我认为这有点复杂,也许是现在更好的方式来存储具有易于检查和访问它们的功能的多个Vertices对象
谢谢
您的示例工作正常,你可以有唯一的问题是与性能问题in
运营商list
是O(n)
如果您不关心按键的顺序(可能的话),请执行以下操作:
self.key_vertices = set()
然后:
if key not in self.key_vertices:
# add a new key to the array
self.key_vertices.add(key)
# create a vertex object to store dependency information
self.verteces.append(Vertex(key, children))
您会在in
运算符中节省很多时间,因为由于密钥哈希, set
in
的方式更快。
而且,如果您不关心self.verteces
顺序,只需self.verteces
字典,在这种情况下,您可能不需要Vertex
结构的第一个key
参数。
self.verteces = dict()
if key not in self.verteces:
# create a vertex object to store dependency information
self.verteces[key] = Vertex(children)
当您需要检查成员资格时,列表不是最佳选择,因为将检查列表中的每个对象。
如果key
是可哈希的,请使用set。 如果它不可散列但具有可比性,请使用树(在标准库中不可用)。 尝试使其可散列。
如果我理解正确,那么您想检查是否已经为O(1)
添加了元素(即,您不必检查列表中的每个元素)。
最简单的方法是使用set 。 集合是无序列表 ,可让您检查元素是否存在恒定时间O(1)
。 您可以将集合视为仅带键的dict,但其工作方式类似于列表:
for value in mySet:
print(value)
print("hello" in mySet)
如果您需要一个有序列表(大多数情况下不需要),则您的方法很好,但是我将使用集合:
self.vertece_set = set() # Init somewhere else ;)
if key not in self.vertece_set:
# add a new key to the array
self.vertece_set.add(key)
# create a vertex object to store dependency information
self.verteces.append(Vertex(key, children))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.