2017-01-16 6 views
2

У меня есть два dicts, что я конвертирую бота в кортежи. Оба dict содержат одни и те же элементы, но они не генерируются с использованием той же логики.Сравнение кортежей с элементами не в порядке

Для примера скажем, у меня есть кортеж вроде этого:

(('a',5),('n',4),('c',8)) 

и 2-й кортеж такова:

(('c',8),('n',4),('a',5)) 

их оригинальных dicts как то (возможно, я не могу знать, как элементы будут упорядочены в дикторе, однако они генерируются из двух диктонов, которые содержат одни и те же элементы (не более, не менее):

{'a':5,'c': 8,'n':4} 

Для человека оба кортежа похожи, но для компьютера это не так.

Как я могу проверить, совпадают ли два кортежа?

ответ

4

Сортировка tuple и сравнение их. Например:

>>> tuple_1 = (('a',5),('n',4),('c',8)) 
>>> tuple_2 = (('c',8),('n',4),('a',5)) 

# Non-sorted --> unequal; issue you are currently facing 
>>> tuple_1 == tuple_2 
False 

# comparing sorted tuples -- equal 
>>> sorted(tuple_1) == sorted(tuple_2) 
True 

Если элементы обоих кортежей являются уникальными, вы можете сравнить их с помощью использования set как:

>>> set(tuple_1) == set(tuple_2) 
True 

В качестве примечания, вы не необходимо преобразовать dict в tuple, чтобы сравнить содержимое словарей. Вы можете непосредственно сравнить dict объекты как:

>>> {1: 2, 3: 4} == {3: 4, 1: 2} 
True 
1
def similarTuple(a,b): 
    h = {} 
    for e in a: 
     h[e] = True 
    for e in b: 
     if e not in h: 
      return False 
    return True 
2

Вы можете также преобразовать кортежи в dict, а затем сравнить их.

Не уверен, что это быстрее/медленнее/то же, что и их сортировка.

dict(t1) == dict(t2) 
+1

Это будет быстрее, чем 'sorted', поскольку сложность создания dict из tuple wi будет 'N'. Но это не удастся, если два элемента в кортеже имеют один и тот же объект в индексе 0. Но опять же, поскольку OP создает «кортеж» из 'dict', ему будет достаточно его требования. Но это не применимо для других, которые ищут сравнение кортежей обобщенным образом. –

0

Вы также мог бы сделать набор обоих кортежей и сравнить их:

a = (('a', 0), ('b', 1), ('c', 2)) 
b = (('b', 1), ('a', 0), ('c', 2)) 
set(a) == set(b) 
+1

не будет работать, если имеется более одного вхождения одного и того же кортежа. –

0

пытается за один лайнер, исследуя получение результата Его из списковых

не эффективен, возможно, забавный

def SameElementsP(a,b): 
    return not ([1 for e in a if e not in b] or [1 for e in b if e not in a])