#python #python_3x
Например lst = [['pen','table'],['pen','apple'],['table','morning']] Значить, что именно мне нужно сделать? А мне нужно, чтобы каждый элемент списка списков стал ключом к списку элементов с которыми он в паре. lst = {'pen': ['table','apple'], 'table': ['pen','morning'], 'apple': ['pen'], 'morning': ['table']}
Ответы
Ответ 1
lst = [['pen', 'table'], ['pen', 'apple'], ['table', 'morning']] result = {} for level1 in lst: for level2 in level1: elements = list(level1) elements.remove(level2) result[level2] = result.get(level2, []) + elements print(result) {'morning': ['table'], 'table': ['pen', 'morning'], 'pen': ['table', 'apple'], 'apple': ['pen']}Ответ 2
В таких случаях удобно collections.defaultdict использовать: from collections import defaultdict d = defaultdict(list) for a, b in lst: d[a].append(b) d[b].append(a) defaultdict сам по себе как словарь работает, но если нужен точный тип, можно dict(d) вызвать. Результат {'apple': ['pen'], 'morning': ['table'], 'pen': ['table', 'apple'], 'table': ['pen', 'morning']}Ответ 3
Как дополнительный вариант без использования defaultdict, можно использовать метод dict.setdefault с похожим эффектом: d = {} for a, b in lst: d.setdefault(a, []).append(b) d.setdefault(b, []).append(a) Метод setdefault(key, default) принимает ключ key, значение по умолчанию default и возвращает значение по ключу key. В случае, если такого ключа не было, он дополнительно добавляет ключ key с переданным значением default. Примерный его код следующий: class dict: def setdefault(self, key, default): if key not in self: self[key] = default return self[key] Недостатки этого решения следующие: Пустые списки создаются каждый раз, когда ключ в словаре уже есть. Метод setdefault имеет не очень понятное название. Тем не менее, здесь мы обходимся стандартной функциональностью словаря. Дополнительно, если требуется поддержать уникальность элементов по ключу (например, в случае, если пары могут повторяться с таким же или обратным порядком), стоит использовать set: lst = [['pen', 'table'], ['pen', 'apple'], ['apple', 'pen'], ['table', 'morning']] d = {} for a, b in lst: d.setdefault(a, set()).add(b) d.setdefault(b, set()).add(a) Или, для решения с defaultdict: from collections import defaultdict d = defaultdict(set) for a, b in lst: d[a].add(b) d[b].add(a) В этих случаях словарь d будет выглядеть следующим образом: {'apple': {'pen'}, 'morning': {'table'}, 'pen': {'apple', 'table'}, 'table': {'morning', 'pen'}} вместо {'apple': ['pen', 'pen'], 'morning': ['table'], 'pen': ['table', 'apple', 'apple'], 'table': ['pen', 'morning']}
Комментариев нет:
Отправить комментарий