Python3: список во вложенный словарь, используйте первые 12 элементов списка в качестве ключей 2-го уровня - PullRequest
0 голосов
/ 25 сентября 2018
  • A subprocess.check_output скрипта bash возвращает запрос из таблицы MySQL в виде строки.
  • split() дает мне список, который содержит каждую ячейку таблицы, прочитанную слева вверху какэлемент, например:

list = ['column1_label', 'column2_label', ..., 'column1_row1_value', 'column2_row1_value, ...,' column1_row2_value ',' column2_row2_value']

Таблица имеет 12 статических столбцов.Теперь я хочу использовать первые 12 элементов списка (которые являются метками столбцов в таблице), которые будут взяты как ключи «2-го уровня» во вложенном словаре, например так:

{'row1': {'column1': 'value', 'column2': 'value', 'column3': 'value', ...}
{'row2': {'column1': 'value', 'column2': 'value', 'column3': 'value', ...}

Мой питоннавыки являются базовыми до сих пор.Я даже не знаю с чего начать.Там есть ответы на некоторые вопросы, касающиеся преобразования списка в вложенный dict, но ни один из них не отвечает конкретно на этот случай.

Ответы [ 4 ]

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

Мое решение, вдохновленное ответом PraveenRB:

# Start bash script getSOAPconfig, with 2 arguments: 1 = host, 2 = db to query
# argv[1] is the first argument given when calling soap.generator.py

egon_external = str(subprocess.check_output(["./getSOAPconfig", sys.argv[1], backends[db]]).decode()).split()

# extract the labels of the column
col_labels = egon_external[:12]

# create a dictionary that uses the col_labels as key
def make_dict(i):
    start = 12*i+12
    i = 0
    result_dict = dict()
    for row in egon_external[start:start+12]:         # for every 12 items
        if i == 12: i = 0                             # in the egon_external list
        result_dict.update({col_labels[i]: row})      # use col_labels as key
        i += 1                                        # then start at col_labels[0] again.
    return result_dict

row_count = int((len(egon_external)-12)/12)
dict_list = []

# Make a list of dictionaries
for i in range(row_count):
    dict_list.append(make_dict(i))

# Now I can call each row by giving the row number (starting from 0) as list index
# of dict_list and the column name as 2nd level key, like so.
print(dict_list[-1]['ext_id'])

Спасибо, @all!

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

Скажем, этот список называется X, и первые 12 элементы должны быть сделаны ключами 2-го уровня.Допустим, у вас есть список Y длины 12, значения которого соответствуют этим 12 ключам.

Предполагая, что каждая строка будет соответствовать своим собственным X и Y, мы можем сделать это как

outer_dict = {}
for i, row in enumerate(rows): # enumerate gives index along with the row
  X, Y = split(row) # assume this gets X and Y from each row 
  keys = X[:12] # first 12 values of X
  inner_dict = {key: value for (key, value) in zip(keys, Y)} # create inner dict
  outer_dict['row{0}'.format(i + 1)] = inner_dict # create new key for outer dict
0 голосов
/ 25 сентября 2018

Здесь list содержит некоторые значения метки.

list = ['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7', 'column8', 'column9', 'column10', 'column11', 'column12',
        'column13', 'column14', 'column15', 'column16', 'column17', 'column18' , 'column19']

Доступ к первым 12 элементам списка

 list_12 = list[:12]

У вас есть словарь с ключом первого уровня.

dictionary = {'row1':{}}

Выполните цикл по list_12 для создания ключа 2-го уровня

for i in list_12:
    dictionary['row1'][i] = 'value'

print(dictionary)

output

{'row1': {'column1': 'value ',' column2 ':' value ',' column3 ':' value ',' column4 ':' value ',' column5 ':' value ',' column6 ':' value ',' column7 ':' value ', 'column8': 'value', 'column9': 'value', 'column10': 'value', 'column11': 'value', 'column12': 'value'}}

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

Вы можете использовать словарное понимание с enumerate:

L = ['column1_label', 'column2_label', 1, 2, 3, 4, 5, 6]

k, m = 2, 2
res = {f'row{i}': dict(zip(L[:k], row)) for i, row in \
       enumerate(zip(L[k::m], L[k+1::m]), 1)}

Результат:

{'row1': {'column1_label': 1, 'column2_label': 2},
 'row2': {'column1_label': 3, 'column2_label': 4},
 'row3': {'column1_label': 5, 'column2_label': 6}}

Конечно, из-за неструктурированной природы вашего списка ввода вам придетсявручную измените k, m в зависимости от ситуации.Но применяется тот же принцип.

...