Python преобразовать список в определенный дикт - PullRequest
0 голосов
/ 28 февраля 2019

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

Ввод :

a = ['AAA: key1', 'value1', 'value2', 'AAA: key2', 'value3', 'value4', 'value5', 'AAA: key3', 'value6', 'value7']

Ожидаемый вывод :

dict_a = {'key1': [value1, value2], 'key2': [value3, value4, value5], 'key3': [value6, value7]}

Моя попытка :

for elem in a:
    if a.startswith(AAA:):
        d_a = {elem}

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Вы также можете использовать itertools.groupby для группировки элементов в «является ключом» и «является значением», а затем объединить последовательные элементы, используя next на том же итераторе:

>>> from itertools import groupby
>>> groups = (next(g).lstrip("AAA: ") if k else list(g)
...           for k, g in groupby(a, key=lambda x: x.startswith("AAA: ")))
...
>>> {g: next(groups) for g in groups}
{'key1': ['value1', 'value2'],
 'key2': ['value3', 'value4', 'value5'],
 'key3': ['value6', 'value7']}
0 голосов
/ 28 февраля 2019

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

def key_val_gen(a):
    key = None
    vals = []
    for item in a:
        if item.startswith('AAA: '):
            if key:
                yield key, vals
            key  = item.split(maxsplit=1)[1]
            vals = []
        else:
            vals.append(item)
    if key:
        yield key, vals

a = ['AAA: key1', 'value1', 'value2', 'AAA: key2', 'value3', 'value4', 'value5', 'AAA: key3', 'value6', 'value7']

print(dict(key_val_gen(a)))
# {'key1': ['value1', 'value2'], 'key2': ['value3', 'value4', 'value5'], 'key3': ['value6', 'value7']}
0 голосов
/ 28 февраля 2019
from collections import defaultdict

result = defaultdict(list)
key = None
a = ['AAA: key1', '  value1', '  value2', 'AAA: key2', '  value3', '  value4', ' value5', 'AAA: key3', '  value6', '  value7']

for elem in a:
    if elem.startswith('AAA:'):
        key = elem.split(':')[1].strip()
    elif key:
        result[key].append(elem.strip())

print(result)
0 голосов
/ 28 февраля 2019

Это один из способов использования collections.defaultdict:

from collections import defaultdict

a = ['AAA: key1', '  value1', '  value2', 'AAA: key2', '  value3', '  value4', '  value5', 'AAA: key3', '  value6', '  value7']

d = defaultdict(list)
for x in a:
    if not x.startswith('AAA'):
        d[c].append(x.strip())
    else:
        c = x.split(': ')[1]

print(d)
# defaultdict(<class 'list'>, {'key1': ['value1', 'value2'], 'key2': ['value3', 'value4', 'value5'], 'key3': ['value6', 'value7']})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...