0

我想知道是否有一种pythonic方式来执行以下操作:

if check_object in list_of_objects:
    return #the object from list
else:
    return check_object

如果在列表中找到匹配的对象,我可以遍历列表以找到匹配的对象,但这似乎有点矫枉过正,有没有更 Pythonic 的方法来做到这一点?

4

4 回答 4

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'
于 2012-08-22T17:11:10.383 回答
0

我想这会奏效...

try:
    idx = list_of_objects.index(check_object)
    return list_of_objects[idx]
except ValueError:
    return check_object

这样做的好处是它只需要在列表中查找对象一次(而不是两次),正如其他一些解决方案所建议的那样。此外,许多人认为“请求宽恕”而不是“先看再跳”更像蟒蛇。(EAFP vs LBYL)

于 2012-08-22T17:31:51.120 回答
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

因此,检查列表中是否存在将始终返回与匹配项相同的项,而比较字典中的键允许您检索不同的项。

于 2012-08-23T02:43:04.930 回答
-2
return check_object if check_object in list_of_objects else None
于 2012-08-22T17:13:57.963 回答