我想知道是否有一种pythonic方式来执行以下操作:
if check_object in list_of_objects:
return #the object from list
else:
return check_object
我可以迭代列表以找到匹配的对象,如果它在列表中找到但是看起来有点矫枉过正,是否有更多的pythonic方法来执行此操作?
答案 0 :(得分:1)
x = ['a', 'b', 'c']
if 'b' in x:
print x[x.index('b')]
else:
print 'not found'
您也可以返回对象本身。使用python> = 2.4:
print 'a' in x and 'a' or 'not found'
答案 1 :(得分:0)
我想这会起作用......
try:
idx = list_of_objects.index(check_object)
return list_of_objects[idx]
except ValueError:
return check_object
这样做的好处是,它只需要在列表中查找一次(而不是两次),就像其他一些解决方案所建议的那样。此外,许多人认为“请求宽恕”而不是“在跳跃之前”更为诡辩。 (EAFP与LBYL)
答案 2 :(得分:0)
“说这两个对象是库存的一部分,你只想要每个对象的一个实例,这些对象可能被认为是相同的名称但具有其他不同的属性,所以你想要返回你已经没有新对象的对象“
但是,你在这里做的事情不会达到这个目的。您正在查找列表中是否存在对象,然后返回该对象。 他们不能拥有不同的属性,因为您正在测试身份而不是相等。最好用list_of_objects
替换dict_of_objects
并根据对象的ID或名称进行查找:
# Example class with identifier
class ExampleObject(object):
def __init__(self, name):
self.name = name
example1 = ExampleObject('one')
# Object Registry: just convenience methods on a dict for easier lookup
class ObjectRegistry(dict):
def register(self, object):
self[object.name] = object
def lookup(self, object):
name = getattr(object, 'name', object)
return self.get(name, object)
# Create the registry and add some objects
dict_of_objects = ObjectRegistry()
dict_of_objects.register(example1)
# Looking up the existing object will return itself
assert dict_of_objects.lookup(example1) is example1
# Looking up a new object with the same name will return the original
example1too = ExampleObject('one')
assert dict_of_objects.lookup(example1too) is example1
因此,检查列表中是否存在将始终返回与匹配的相同项,而比较字典中的键可以检索不同的项。
答案 3 :(得分:-2)
return check_object if check_object in list_of_objects else None