Arhn - архитектура программирования

Сгруппируйте элементы в списке списков во вложенный словарь

У меня есть следующий образец списка списков (показан только раздел):

[
["4YBB|1|AA|A|262", "4YBB|1|AA|A|263", "s35"], 
["4YBB|1|AA|U|261", "4YBB|1|AA|A|263", "tSH",], 
["4YBB|1|AA|U|261", "4YBB|1|AA|C|264", "ntSH", "s55"], 
["4YBB|1|AA|G|259", "4YBB|1|AA|C|267", "cWW"], 
["4WOI|1|DA|A|262", "4WOI|1|DA|A|263", "s35", "cWW"], 
["4WOI|1|DA|C|264", "4WOI|1|DA|G|265", "s35"]
....
]

Я хотел бы сгруппировать элементы в этом списке во вложенный словарь на основе следующего списка ключей:

outer_key = ["4YBB|1|AA", "4WOI|1|DA"]
inner_key = [(259, 267), (259, 260), (260, 261), (260, 265), (260, 267), (261, 263), (261, 264), (262, 263), (264, 265), (265, 267)]

Как вы можете заметить, внешний ключ представляет собой подмножество элементов с индексом [0] и индексом [1] внутреннего списка, тогда как значения кортежа внутреннего ключа представляют последний элемент индекса [0] и индекса [1] списка. внутренний список при разделении с помощью '|' персонаж. Внутренние ключевые кортежи представляют все возможные комбинации позиций (x, y), которые могут иметь «взаимодействие» (индекс [2] и далее внутреннего списка). Таким образом, не все ключи будут иметь значение, связанное с ним. Если конкретный внутренний ключ кортежа отсутствует, добавьте «-» к его значению.

pw_info = {
 "4YBB|1|AA" : {

            (259, 267): "cWW",
            (259, 260): "-",
            (260, 261): "-",
            (260, 265): "-",
            (260, 267): "-",
            (261, 263): "tSH",
            (261, 264): "ntSH;s55",
            (262, 263): "s35",
            (264, 265): "-",
            (265, 267): "s35"

           },

 "4WOI|1|DA" : {

            (259, 267): "-",
            (259, 260): "-",
            (260, 261): "-",
            (260, 265): "-",
            (260, 267): "-",
            (261, 263): "-",
            (261, 264): "-",
            (262, 263): "s35;cWW",
            (264, 265): "s35",
            (265, 267): "-"

            }            
}

Ключи должны быть заказаны в соответствии с внешним и внутренним списками ключей. Кроме того, внутренний список может содержать более 3 элементов. Если элементов более 3, соедините элементы с индексом [2] и выше вместе, используя ";" как значение внутреннего словаря (например: (261, 264): "ntSH;s55" ). Как лучше всего это сделать?

03.07.2019

  • Откуда берутся некоторые пустые элементы, например (260, 261): -? Я не вижу их в начальном списке списков? 03.07.2019
  • @dasvootz Некоторые из внутренних списков содержат эти комбинации значений кортежа. Я не показываю все для простоты. 03.07.2019

Ответы:


1

Что касается "Ключи должны быть упорядочены в соответствии с внешним и внутренним списками ключей" - имейте в виду, что словари являются неупорядоченными структурами данных.
OrderedDict объект является альтернативой.

from collections import OrderedDict
import pprint

input_list = [
    ["4YBB|1|AA|A|262", "4YBB|1|AA|A|263", "s35"],
    ["4YBB|1|AA|U|261", "4YBB|1|AA|A|263", "tSH", ],
    ["4YBB|1|AA|U|261", "4YBB|1|AA|C|264", "ntSH", "s55"],
    ["4YBB|1|AA|G|259", "4YBB|1|AA|C|267", "cWW"],
    ["4WOI|1|DA|A|262", "4WOI|1|DA|A|263", "s35", "cWW"],
    ["4WOI|1|DA|C|264", "4WOI|1|DA|G|265", "s35"]
]

outer_keys = ["4YBB|1|AA", "4WOI|1|DA"]
inner_keys = [(259, 267), (259, 260), (260, 261), (260, 265), (260, 267),
             (261, 263), (261, 264), (262, 263), (264, 265), (265, 267)]

# prepopulated dict indexed by `outer_keys` and 
# containing OrderedDicts with default values for `inner_keys`  
pw_info = {k: OrderedDict({t: '-' for t in inner_keys}) for k in outer_keys}

for sub_lst in input_list:
    # extract starting slice from first 2 items (like `4YBB|1|AA`)
    k0, k1 = sub_lst[0][:9], sub_lst[1][:9]
    # check if 2 slices are equal and contained in `pw_info` dict (i.e. `outer_keys`)
    if k0 == k1 and k0 in pw_info:
        v1, v2 = sub_lst[0], sub_lst[1]
        # `sub_key` is aimed to be a key for inner dict of the predefined `pw_info` dict
        # thus it's composed as a tuple of trailing numbers of the first 2 items
        # in sub_list (ex. `(262, 263)`)
        sub_key = (int(v1[v1.rfind('|')+1:]), int(v2[v2.rfind('|')+1:]))
        pw_info[k0][sub_key] = sub_lst[2] if len(sub_lst) == 3 else ';'.join(sub_lst[2:])

pprint.pprint(pw_info)

Выход:

{'4WOI|1|DA': OrderedDict([((259, 267), '-'),
                           ((259, 260), '-'),
                           ((260, 261), '-'),
                           ((260, 265), '-'),
                           ((260, 267), '-'),
                           ((261, 263), '-'),
                           ((261, 264), '-'),
                           ((262, 263), 's35;cWW'),
                           ((264, 265), 's35'),
                           ((265, 267), '-')]),
 '4YBB|1|AA': OrderedDict([((259, 267), 'cWW'),
                           ((259, 260), '-'),
                           ((260, 261), '-'),
                           ((260, 265), '-'),
                           ((260, 267), '-'),
                           ((261, 263), 'tSH'),
                           ((261, 264), 'ntSH;s55'),
                           ((262, 263), 's35'),
                           ((264, 265), '-'),
                           ((265, 267), '-')])}
03.07.2019
  • Это потрясающе! Не могли бы вы объяснить логику части sub_key, прежде чем я приму этот ответ? Спасибо 03.07.2019
  • @TheEmperor, добро пожаловать, я добавил объяснение через комментарии 03.07.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..