2016-03-18 4 views
1

У меня есть два списка и вам нужно проверить, содержат ли они одни и те же объекты в том же порядке.Как проверить, имеют ли два списка одни и те же объекты в одном порядке?

list1 = [object1 , object2 , object3] 
list2 = [object1 , object2 , object3] 
list3 = [object2 , object3 , object1] 

список list1 и list2 Сравнивая результат должен быть true.

Составляющий список list1 и list3, результат должен быть false.

Edit: примерный список Пример: list = [[<object1 at 0x04130AB0>], [<object2 at 0x04130210>, <object3 at 0x04130A10>]]

ответ

1

Простой, Просто используйте == в comapare два списка. Это должно вернуть True если два списка, имеющих одни и те же элементы и должны быть размещены в том же порядке, иначе она возвращает False

list1 == list2 

функция, которая реализует описанную выше логику должна выглядеть,

def check_lists(list1, list2): 
    return list1 == list2 

Ex:

>>> ['object1' , 'object2' , 'object3'] == ['object1' , 'object2' , 'object3'] 
True 
>>> ['object1' , 'object2' , 'object3'] == ['object3', 'object1' , 'object2' ] 
False 
>>> [['object1' , 'object2'] , ['object3']] == [['object1' , 'object2'] ,['object3']] 
True 
>>> [['object1' , 'object2'] , ['object3']] == [['object1' , 'object2'] , 'object3'] 
False 
+0

это объект не строка ... я буду иметь ссылки что-то вроде списка = [[] , [, ]] – FryMan

+0

@FryMan, какой бы тип данных ни был, он должен работать. Это список списков? –

+0

да, это список списков – FryMan

0

Принимая во внимание тождественность Т по вопросам равенства.

def check_id(li1, li2): 
    return [id(o) for o in li1] == [id(o) for o in li2] 
2

== Базовый будет проверять только тогда, когда каждый элемент в одном list равен соответствующему элементу в другом list. Однако, учитывая ваш пример lst = [[<object1 at 0x04130AB0>], [<object2 at 0x04130210>, <object3 at 0x04130A10>]], вы пытаетесь проверить личность. Два объекта с разными идентичностями могут сравниваться как «равные», в зависимости от определения этого класса. Вот некоторые примеры, где == бы вам сказать, что два list s содержат одни и те же объекты в том же порядке, когда они этого не делают:

>>> import collections 
>>> a = collections.Counter() 
>>> b = collections.Counter() 
>>> a is b 
False 
>>> l1 = [a, b] 
>>> l2 = [b, a] 
>>> l1 == l2 
True 
>>> class Person: 
...  def __eq__(self, other): 
...   return True 
... 
>>> a = Person() 
>>> b = Person() 
>>> a is b 
False 
>>> l1 = [a, b] 
>>> l2 = [b, a] 
>>> l1 == l2 
True 
>>> a = [] 
>>> b = [] 
>>> a is b 
False 
>>> l1 = [a, b] 
>>> l2 = [b, a] 
>>> l1 == l2 
True 
>>> a.append(0) 
>>> l1 == l2 
False 

Если вы хотите, чтобы проверить, что соответствующие элементы на самом деле тот же объект (личность, а не равенство), вам нужно будет вручную сравнить идентичностей каким-либо образом, например, следующее:

>>> import collections 
>>> a = collections.Counter() 
>>> b = collections.Counter() 
>>> a is b 
False 
>>> l1 = [a, b] 
>>> l2 = [b, a] 
>>> all(x is y for x,y in zip(l1, l2)) 
False 
>>> a = Person() 
>>> b = Person() 
>>> a is b 
False 
>>> l1 = [a, b] 
>>> l2 = [b, a] 
>>> all(x is y for x,y in zip(l1, l2)) 
False 
>>> a = [] 
>>> b = [] 
>>> a is b 
False 
>>> l1 = [a, b] 
>>> l2 = [b, a] 
>>> all(x is y for x,y in zip(l1, l2)) 
False 
Смежные вопросы