Переход назад и вперед между наборами и кортежами в python - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть словарь с, скажем, n строками, в которых в каждой строке у меня есть набор значений и кортежей в качестве ключей. Примерно так:

a = {(-1,2):40, (4,5):10, (-6,1):20, (2,-3):30, ...}

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

b = {(4,5):10, (-6,1):20, (-1,2):40, (2,-3):30, ...}

, поэтому в основном b равно a, но порядок элементов не тот же , Проблема в том, что я не смог придумать хороший способ проверить это. Я не могу использовать наборы в качестве ключей и быстро подтвердить a == b, а если я поставлю кортежи в качестве ключей, то a == b is false, поскольку порядок зашифрован. Я попробовал tuple(set()) их, тоже не сработало. Так что я думал о том, чтобы сохранить ключи как tuple(set()), вроде как «развязать» их на промежуточном этапе, проверить и вернуть их обратно. Я не думаю, что распаковка здесь помогает, так как я не хочу смешивать то, что находится внутри кортежей, например (4,5, -6,1, ...) , что я в конечном итоге хочу сделать, это посмотреть, есть ли у меня уже эта комбинация кортежей в моем словаре, независимо от того, как упорядочены элементы.

Дайте мне знать, если я не могу прояснить ситуацию, я новичок в программировании, так что да, спасибо.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

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

def normalized(d): return { tuple(sorted(k)):v for k,v in d.items() }

if normalized(a) == normalized(b):
    ...

Обратите внимание, что это не очень эффективно, и вы должны рассмотреть возможность работы с нормализованными ключами в остальной части программы (т.е. нормализуйте данные как можно раньше, когда они будут прочитаны / получены)

0 голосов
/ 02 апреля 2020

Вы делаете что-то не так, порядок не имеет значения в словарях ...

In [1]: x = {(1,2):3, (4,5):6}                                                                                                            

In [2]: y = {(4,5):6, (1,2):3}                                                                                                            

In [3]: x == y                                                                                                                            
Out[4]: True
...