Как заархивировать значения в двух словарях - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть 2 словаря:

{('x0', '0'): 'x0', ('x0', '1'): 'x1', ('x1', '0'): 'x1', ('x1', '1'): 'x0'}

и

{('y0', '0'): 'y1', ('y0', '1'): 'y1', ('y1', '0'): 'y0', ('y1', '1'): 'y0'}

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

{(('x0','y0'), 0) : ('x0','y1'), 
(('x0', 'y0'), 1) : ('x1, 'y1')... and so on}

Каков наилучший способ достичь этого?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

В Python3.7 словари упорядочены, таким образом, вы можете выполнять итерации по dict.items():

d1 = {('x0', '0'): 'x0', ('x0', '1'): 'x1', ('x1', '0'): 'x1', ('x1', '1'): 'x0'}
d2 = {('y0', '0'): 'y1', ('y0', '1'): 'y1', ('y1', '0'): 'y0', ('y1', '1'): 'y0'}
new_d = {((c, d), b):(a, e) for ([c, b], a), ([d, _], e) in zip(d1.items(), d2.items())}

Вывод:

{(('x0', 'y0'), '0'): ('x0', 'y1'), (('x0', 'y0'), '1'): ('x1', 'y1'), (('x1', 'y1'), '0'): ('x1', 'y0'), (('x1', 'y1'), '1'): ('x0', 'y0')}

Однако это решение будет работать только в Python3+0,7.Для использования в любых других версиях рассмотрите возможность использования collections.OrderedDict или реализацию структуры в виде списка кортежей, чтобы гарантировать, что всегда происходит правильное сопряжение.

0 голосов
/ 22 ноября 2018

Как уже упоминалось @ Ajax1234, до Python 3.7 dict.items не заказывалось, но это не значит, что вы не можете отсортировать его самостоятельно!

Подтверждение того, что оно неупорядочено (Python 3.5)

In [132]: list(zip(x.items(), y.items()))
Out[132]:
[((('x0', '0'), 'x0'), (('y0', '1'), 'y1')),
 ((('x1', '0'), 'x1'), (('y1', '0'), 'y0')),
 ((('x0', '1'), 'x1'), (('y0', '0'), 'y1')),
 ((('x1', '1'), 'x0'), (('y1', '1'), 'y0'))]

Явный заказ

In [129]: list(zip(sorted(x.items()), sorted(y.items())))
Out[129]:
[((('x0', '0'), 'x0'), (('y0', '0'), 'y1')),
 ((('x0', '1'), 'x1'), (('y0', '1'), 'y1')),
 ((('x1', '0'), 'x1'), (('y1', '0'), 'y0')),
 ((('x1', '1'), 'x0'), (('y1', '1'), 'y0'))]

Создание вашего нового dict

In [131]: {((x0, y0), x1): (x, y) for ((x0, x1), x), ((y0, y1), y) in zip(sorted(x.items()), sorted(y.items()))}

Out[131]:
{(('x0', 'y0'), '0'): ('x0', 'y1'),
 (('x0', 'y0'), '1'): ('x1', 'y1'),
 (('x1', 'y1'), '0'): ('x1', 'y0'),
 (('x1', 'y1'), '1'): ('x0', 'y0')}
0 голосов
/ 22 ноября 2018

Я не вполне уверен, что вы получаете, но следующее делает что-то вроде того, что вы описываете:

a = {('x0', '0'): 'x0', ('x0', '1'): 'x1', ('x1', '0'): 'x1', ('x1', '1'): 'x0'}
b = {('y0', '0'): 'y1', ('y0', '1'): 'y1', ('y1', '0'): 'y0', ('y1', '1'): 'y0'}
{((x[0], y[0]), x[1]): (a[x], b[y]) for x, y in zip(a.keys(), b.keys())}
>> {(('x0', 'y0'), '0'): ('x0', 'y1'), (('x0', 'y0'), '1'): ('x1', 'y1'), (('x1', 'y1'), '0'): ('x1', 'y0'), (('x1', 'y1'), '1'): ('x0', 'y0')}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...