Преобразование списка «пар» в словарь словарей? - PullRequest
0 голосов
/ 06 сентября 2018

Этот вопрос ранее задавался здесь с вопиющей опечаткой: Подсчет "уникальных пар" чисел в словаре Python?

Это алгоритмическая проблема, и я не знаю наиболее эффективного решения. Моя идея состояла бы в том, чтобы как-то кэшировать значения в списке и перечислять пары ... но это было бы так медленно. Я предполагаю, что есть что-то полезное от itertools.

Допустим, у меня есть список целых чисел, которые никогда не повторяются:

list1 = [2, 3]   

В этом случае существует уникальная пара 2-3 и 3-2, поэтому словарь должен быть:

{2:{3: 1}, 3:{2: 1}}

То есть, есть 1 пара из 2-3 и 1 пара из 3-2.

Для больших списков спаривание такое же, например

list2 = [2, 3, 4]

имеет диктитон

{2:{3:1, 4:1}, 3:{2:1, 4:1}, 4:{3:1, 2:1}}

(1) Как только размер списков станет намного больше, как можно алгоритмически находить «уникальные пары» в этом формате, используя структуры данных python?

(2) Я упоминал, что списки не могут иметь повторяющиеся целые числа, например

[2, 2, 3]

невозможно, так как есть две 2.

Однако список списков может быть:

list3 = [[2, 3], [2, 3, 4]] 

при этом словарь должен быть

{2:{3:2, 4:1}, 3:{2:2, 4:1}, 4:{2:1, 3:1}}

так как есть две пары 2-3 и 3-2. Как можно «обновить» словарь, учитывая несколько списков в списке?

РЕДАКТИРОВАТЬ: мой окончательный вариант использования, я хочу перебрать сотни списков целых чисел, и создать один словарь с "количеством" пар. Имеет ли это смысл? Может быть другая структура данных, которая более полезна.

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

использование defaultdict с перестановками

from collections import defaultdict
from itertools import permutations

d = defaultdict(dict)
for i in [x for x in permutations([4,2,3])]:
    d[i[0]] = {k: 1 for k in i[1:]}

вывод

In [22]: d
Out[22]: defaultdict(dict, {2: {3: 1, 4: 1}, 4: {2: 1, 3: 1}, 3: {2: 1, 4: 1}})

для наследования списков https://stackoverflow.com/a/52206554/8060120

0 голосов
/ 06 сентября 2018

Для примера с вложенным списком вы можете сделать следующее, используя itertools.permutations и dict.setdefault:

from itertools import permutations

list3 = [[2, 3], [2, 3, 4]]

d = {}
for l in list3:
    for a, b in permutations(l, 2):
        d[a][b] = d.setdefault(a, {}).setdefault(b, 0) + 1

# {2: {3: 2, 4: 1}, 3: {2: 2, 4: 1}, 4: {2: 1, 3: 1}}

Для плоских списков l, используйте только внутренний цикл и пропустите внешний

0 голосов
/ 06 сентября 2018

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

values = [3, 2, 4]
result = dict.from_keys(values)
for key, value in result.items():
    value = {}
    for num in values:
        if num != key:
            value[num] = 1

Это создает диктовку с каждым номером в качестве ключа. Теперь в каждом ключе сделайте значение вложенным диктом, содержимое которого равно num: 1 для каждого числа в списке исходных значений, если это не имя ключа, в котором мы находимся

...