Преобразовать список списков в словарь с уникальными ключами и всеми соответствующими значениями - PullRequest
1 голос
/ 31 мая 2019

Я новичок в Python, и сейчас я борюсь с одной проблемой. У меня есть список списков:

[[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]

Моя цель - сделать из него словарь следующего формата:

{0:[1],1:[2,8],2:[8,1,4,5],3:[4],5:[6,7,2],6:[5,7],7:[5,6],8:[1,2,10,9,11,12],9:[8,10,11,12],10:[8,9,11,12],11:[12,10,9,8],12:[11,9,10,8]}.

Короче говоря:

Он должен создать словарь с уникальными ключами от 1 до 12 в этом случае (все уникальные числа в списке), и каждому ключу он назначает список значений, который является общим подмножеством для этого ключа, то есть для ключа 2 он появляется в списках [4,2], [2,5], [1,2,8], поэтому ему необходимо присвоить ключу 2 значение, которое представляет собой список чисел в этих 3 списках, кроме 2.

Таким образом, вывод для ключа 2 должен быть: 2:[8,1,4,5] и т. Д.

Я сделал код:

data = [[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]

graph = {}
for i in range(13):
    graph[i] = 3

numbers = list(range(0,13))
for row in data:
    for i in graph.keys():
        if i in row:
            graph[i] = row

for key,value in graph.items():
    graph[key] = graph[key][1:]

print(graph)

Тем не менее, это дает мне вывод:

{0: [1], 1: [2, 8], 2: [5], 3: [4], 4: [2], 5: [6, 7], 6: [6, 7], 7: [6, 7], 8: [9, 10, 11, 12], 9: [9, 10, 11, 12], 10: [9, 10, 11, 12], 11: [9, 10, 11, 12], 12: [9, 10, 11, 12]}

Я действительно не знаю, как объединить эти списки таким образом, чтобы получить желаемый результат.

Ответы [ 5 ]

2 голосов
/ 31 мая 2019

Вы присваиваете graph[i] только одной строке, поэтому, если вы встретите другую строку, содержащую i, ответы из вашей начальной строки будут переназначены.Вместо этого вы можете назначить пустой список для graph[i] вместо 3, добавить вместо graph[i].

graph = {}
for i in range(13):
  graph[i] = []

for row in data:
  for i in graph.keys():
    if i in row:
      for val in row:
        if val != i:
          graph[i].append(val)
2 голосов
/ 31 мая 2019
d=dict()
entries=[]
for i in range(0,13):
    entries=[]
    for j in data:
        if i in j:
            entries+=[num for num in j if num!=i]
    d[i]=entries

Выход

{0: [1],
 1: [0, 2, 8],
 2: [1, 8, 4, 5],
 3: [4],
 4: [3, 2],
 5: [2, 6, 7],
 6: [5, 7],
 7: [5, 6],
 8: [1, 2, 9, 10, 11, 12],
 9: [8, 10, 11, 12],
 10: [8, 9, 11, 12],
 11: [8, 9, 10, 12],
 12: [8, 9, 10, 11]}
2 голосов
/ 31 мая 2019

Вы можете использовать defaultdict здесь:

from collections import defaultdict

mylist = [[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]

d = defaultdict(list) # a dictionary with all values defaulting to lists

for lst in mylist:
    for val in lst:
        # extend each list with new values provided they aren't
        # equal to the key in question
        d[val].extend([x for x in lst if x!=val])

d
# {0: [1], 1: [0, 2, 8], 2: [1, 8, 4, 5], 8: [1, 2, 9, 10, 11, 12], 3: [4], 4: [3, 2], 5: [2, 6, 7], 6: [5, 7], 7: [5, 6], 9: [8, 10, 11, 12], 10: [8, 9, 11, 12], 11: [8, 9, 10, 12], 12: [8, 9, 10, 11]}

Используя defaultdict, вам не нужно беспокоиться о присвоении списка значению по умолчанию, поэтомуВы можете просто использовать стандартные атрибуты list, такие как append и extend.

Существует соображение производительности, поскольку вы повторяете lst N + 1 раз, где N - длина lst.extend является операцией O (N), поэтому создание списка и , расширяющего существующий, не совсем производительно.Он также не учитывает повторяющиеся значения (если это важно для вас).Однако это немного чище, чем пытаться использовать стандартный dict, который вы могли бы сделать:

d = {}
for lst in mylist:
    for val in lst:
        if val not in d:
            d[val] = [x for x in lst if x!=val]
        else:
            d[val].extend([x for x in lst if x!=val])

d
# {0: [1], 1: [0, 2, 8], 2: [1, 8, 4, 5], 8: [1, 2, 9, 10, 11, 12], 3: [4], 4: [3, 2], 5: [2, 6, 7], 6: [5, 7], 7: [5, 6], 9: [8, 10, 11, 12], 10: [8, 9, 11, 12], 11: [8, 9, 10, 12], 12: [8, 9, 10, 11]}

, где вы должны проверить, есть ли в словаре val для построения list,в противном случае вы можете изменить значение на месте с помощью extend

1 голос
/ 31 мая 2019
a=[[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]
from collections import defaultdict


dic=defaultdict(list)
for i,v in enumerate(a):
    for j, v2 in enumerate(v):        
        new_s=a[i][:j]+a[i][j+1:]
        dic[v2].extend(new_s)

for i in dic:
    dic[i]=list(set(dic[i]))

print(dict(dic))

выход

{0: [1],
 1: [0, 8, 2],
 2: [8, 1, 4, 5],
 8: [1, 2, 9, 10, 11, 12],
 3: [4],
 4: [2, 3],
 5: [2, 6, 7],
 6: [5, 7],
 7: [5, 6], 
 9: [8, 10, 11, 12],
 10: [8, 9, 11, 12], 
 11: [8, 9, 10, 12],
 12: [8, 9, 10, 11]
 }
1 голос
/ 31 мая 2019

Вы хотите исправить свой код конкретно или вы просто ищете решение?

data = [[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]
n = 12

# Create dict with empty list for each key
result = {key: [] for key in range(n + 1)}

for key in result:
    for x in data:
        if key in x:
            # We need to make a copy of `x` because otherwise we'd modify `data`
            x = x.copy()
            x.remove(key)
            result[key].extend(x)

print(result)

Это подход с акцентом на ясность, поэтому я уверен, что время выполнения все еще можетбыть улучшеннымОн печатает:

{0: [1], 1: [0, 2, 8], 2: [1, 8, 4, 5], 3: [4], 4: [3, 2], 5: [2, 6, 7], 6: [5, 7], 7: [5, 6], 8: [1, 2, 9, 10, 11, 12], 9: [8, 10, 11, 12], 10: [8, 9, 11, 12], 11: [8, 9, 10, 12], 12: [8, 9, 10, 11]}

Кроме того, имеет ли значение заказ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...