2012-02-20 5 views
6

Я хочу, чтобы сравнить два списка кортежей:Как выполнить сравнение глубокого равенства двух списков кортежей?

larry = [(1,'a'), (2, 'b')] 
moe = [(2, 'b'), (1, 'a')] 

таким образом, что порядок элементов в списке могут отличаться. Существуют ли библиотечные функции для этого?

>> deep_equals(larry, moe) 
True 

ответ

4

Если все, о чем вы заботитесь, это порядок предметов в самом дальнем списке (это то, что предлагает мне все, кроме слова «глубокое», —, это само по себе вызывает у меня сомнения в том, что вы имели в виду), и вы знайте, что дубликатов не будет, вы можете использовать set.

>>> larry = [(1,'a'), (2, 'b')] 
>>> moe = [(2, 'b'), (1, 'a')] 
>>> set(larry) == set(moe) 
True 

Если дело так просто, как эти две кортежей, вы можете также использовать dict, который будет {1: 'a', 2: 'b'}. Это может быть или не быть более удобной структурой для вас. В любом случае, сравнение dict(larry) == dict(moe) будет делать то, что вы хотите.

Если вы беспокоитесь о дубликатах, вам потребуется немного больше работы, взяв копии списков и вытаскивая элементы один за другим, пока это не сработает, или пустое.

+0

Не будет никакой возможности дублирования. – canadadry

+0

Итак, я думаю, что это то, что вы хотите? –

6

Если я понимаю вас, ваши кортежи представляют наборы, а ваши списки представляют собой наборы. Очевидная вещь, чтобы сделать, чтобы преобразовать их в наборы:

def setterific(l): 
    return frozenset(frozenset(p) for p in l) 

setterific(larry) == setterific(moe) 

Это использует frozensets, потому что один не может иметь наборы множеств питона (потому что наборы изменяемые); см. How can I create a Set of Sets in Python?.

Если у вас только один уровень комплектов, перейдите к frozenset(larry) == frozenset(moe).

+0

Кортежи не представляют собой наборы. Они заказываются заголовками SMTP. – canadadry

+0

@BonAmi: Ваш вопрос неоднозначен, поэтому другие ответы затрагивают тот же самый сценарий, который у меня есть. – Marcin