2012-08-22 106 views
0

我想知道是否有做了Python的方式如下:如果在列表列表返回對象

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

我可以遍歷列表中找到匹配的對象,如果發現名單內,但這似乎是矯枉過正,有沒有更pythonic的方式來做到這一點?

+12

如果'check_object'在列表中,那麼從列表中返回對象無論如何都等價於返回'check_object'。不管怎麼樣,你爲什麼不返回'check_object'? – BrenBarn

+0

說這兩個對象是一個清單的一部分,你只需要每個對象的一個​​實例,這些對象可以被認爲是平等的名稱,但有其他不同的屬性,所以你想返回對象,你已經沒有一個新的 –

+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' 
-2
return check_object if check_object in list_of_objects else None 
+0

這不會執行查找,這是必需的。 –

0

我想這會工作...

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

這樣做的優點是,它僅需要尋找在列表中的對象一次(而不是兩次),正如其他一些解決方案所暗示的那樣。此外,許多人認爲「請求寬恕」而不是「跳躍式前瞻」更加pythonic。 (EAFP vs LBYL)

0

「說這兩個對象是庫存的一部分,你只需要每個對象的一個​​實例,這些對象可以被認爲是平等的名稱,但有其他不同的屬性,所以你想返回對象已經沒有一個新的「

雖然你在這裏做什麼不會達到。您正在查找列表中是否存在對象,然後返回相同的對象。 它們不能具有不同的屬性,因爲您正在測試身份並且不是相等的

這可能是更好的爲您更換list_of_objectsdict_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 

所以,檢查是否存在在列表中總是會返回相同項目作爲匹配的那個,而比較字典中的鍵允許您檢索不同的項目。