Список во вложенный список и словарь - PullRequest
0 голосов
/ 03 августа 2020

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

L= ["a","abc","de","efg","", "b","ijk","lm","op","qr","", "c","123","45","6789"]          

вывод:

nested list:
[["a","abc","de","efg"], ["b","ijk","lm","op","qr"], ["c","123","45","6789"]] 

dictionary: 
{"a":["abc","de","efg"],
"b":["ijk","lm","op","qr"], "c":["123","45","6789] } 

Кто-нибудь может сказать мне, как это сделать в python? И я ничего не могу импортировать

Ответы [ 3 ]

3 голосов
/ 03 августа 2020

Я предполагаю, что группы разделены пустыми строками. Для этого вы можете использовать itertools.groupby:

from itertools import groupby

data = ["a","abc","de","efg","", "b","ijk","lm","op","qr","", "c","123","45","6789"] 

nl = [list(g) for k, g in groupby(data, ''.__ne__) if k]
d = {next(g): list(g) for k, g in groupby(data, ''.__ne__) if k}

print(nl)
print(d)

Результаты:

[['a', 'abc', 'de', 'efg'], ['b', 'ijk', 'lm', 'op', 'qr'], ['c', '123', '45', '6789']]
{'a': ['abc', 'de', 'efg'], 'b': ['ijk', 'lm', 'op', 'qr'], 'c': ['123', '45', '6789']}

В группе я использую ''.__ne__, который является функцией для «не равно» пустой строки. Таким образом, он захватывает только группы непустых строк.

EDIT

Я только что прочитал, что вы не можете импортировать. Вот решение, просто используя al oop:

nl = [[]]

for s in data:
    if s:
        nl[-1].append(s)
    else:
        nl.append([])

И для dict:

itr = iter(data)
key = next(itr)
d = {key: []}

while True:
    try: val = next(itr)
    except StopIteration: break
    if val:
        d[key].append(val)
    else:
        key = next(itr)
        d[key] = []
0 голосов
/ 03 августа 2020

Насколько я понимаю, вы пытаетесь:

  1. Разделить список пустой строкой, а затем
  2. Преобразовать полученный вложенный список в словарь, используя первый элемент каждой подгруппы -list как ключ, а остальные как значение.

Вы, безусловно, можете выполнить sh задачу без какого-либо импорта. Чтобы разделить список, просто перебирайте его и попутно создавайте вложенный список:

def split(data, on):
    nested = []
    curr = []
    for x in data:
        if x == on:
            nested.append(curr)
            curr = []
        else:
            curr.append(x)
    if curr != [] or data[-1:] == [on]:
        nested.append(curr)
    return nested

Затем снова перебирайте этот вложенный список, чтобы построить желаемый словарь:

def build_dict(key_valss):
    d = {}
    for key_vals in key_valss:
        if key_vals != []:
            key = key_vals[0]
            vals = key_vals[1:]
            d[key] = vals
    return d

Составьте две функции, чтобы получить то, что вы хотите:

>>> build_dict( split(data = ["a","abc","de","efg","", "b","ijk","lm","op","qr","", "c","123","45","6789"] , on = '') )
{'a': ['abc', 'de', 'efg'], 'b': ['ijk', 'lm', 'op', 'qr'], 'c': ['123', '45', '6789']}
0 голосов
/ 03 августа 2020

Вот как преобразовать L во вложенный список:

L= ["a","abc","de","efg","","b","ijk","lm","op","qr","","c","123","45","6789"] 

nested_list_L = []

temp = []
for item in L:
    if item != "":
        temp.append(item)
    else:
        nested_list_L.append(temp)
        temp = []
        
nested_list_L.append(temp)

А вот как преобразовать L в словарь:

L= ["a","abc","de","efg","","b","ijk","lm","op","qr","","c","123","45","6789"] 

dict_L = {}

temp = []
key = ""
for item in L:
    if len(item) == 1:
        key = item
    elif len(item) > 1:
        temp.append(item)
    else:
        dict_L[key] = temp
        temp = []
        key = ""
        
dict_L[key] = temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...