Как преобразовать список строк в список словарей в Python - PullRequest
0 голосов
/ 10 марта 2019

Предположим, у меня есть список строк в Python:

['Name: volume_test_add_volume_to_cg_2019_03_07-12_21_37', 'Index: 24', 
 'Name: volume_xx111', 'Index: 3', 'Name: volume_xx11541', 'Index: 4', 
 'Name: Volume_test_add_volume_mandatory_params_2019_03_06-16_50_10', 'Index: 6']

Как преобразовать их в список словарей, чтобы конечный результат был таким:

[
 {'Name': 'volume_test_add_volume_to_cg_2019_03_07-12_21_37', 'Index': '24'}, 
 {'Name': 'volume_xx111', 'Index': '3'}, 
 {'Name': 'volume_xx11541', 'Index': '4'}, 
 {'Name': 'Volume_test_add_volume_mandatory_params_2019_03_06-16_50_10', 'Index': '6}
]

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Вы должны решить, в коде, как группировать строки в словари.Возможно, в каждом элементе всегда 2 элемента, или всегда есть запись Name, или вам просто нужно создавать новый словарь каждый раз, когда ключ просматривался ранее.

Если всегда есть N элементов в словаре, затем итерация в блоках такого размера :

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

results = [
    dict(tuple(map(str.strip, entry.split(': '))) for entry in per_dict)
    for per_dict in chunks(inputlist, 2)
]

Демо:

>>> from pprint import pprint
>>> inputlist = ['Name: volume_test_add_volume_to_cg_2019_03_07-12_21_37', 'Index: 24', 'Name: volume_xx111', 'Index: 3', 'Name: volume_xx11541', 'Index: 4', 'Name: Volume_test_add_volume_mandatory_params_2019_03_06-16_50_10', 'Index: 6']
>>> def chunks(l, n):
...     """Yield successive n-sized chunks from l."""
...     for i in range(0, len(l), n):
...         yield l[i:i + n]
...
>>> [
...     dict(tuple(map(str.strip, entry.split(': '))) for entry in per_dict)
...     for per_dict in chunks(inputlist, 2)
... ]
[{'Name': 'volume_test_add_volume_to_cg_2019_03_07-12_21_37', 'Index': '24'}, {'Name': 'volume_xx111', 'Index': '3'}, {'Name': 'volume_xx11541', 'Index': '4'}, {'Name': 'Volume_test_add_volume_mandatory_params_2019_03_06-16_50_10', 'Index': '6'}]
>>> pprint(_)
[{'Index': '24', 'Name': 'volume_test_add_volume_to_cg_2019_03_07-12_21_37'},
 {'Index': '3', 'Name': 'volume_xx111'},
 {'Index': '4', 'Name': 'volume_xx11541'},
 {'Index': '6',
  'Name': 'Volume_test_add_volume_mandatory_params_2019_03_06-16_50_10'}]

Если лучше увидеть повтор ключа, лучшезатем начните со списка result, содержащего пустой словарь;Вы добавляете пары ключ-значение к result[-1].Затем обработайте ваши строки одну за другой, разделив каждую строку на символ ':', чтобы создать пару ключ-значение.Если ключ уже найден в самом последнем словаре, запустите новый пустой:

results = [{}]
for entry in inputlist:
    key, value = map(str.strip, entry.split(':'))  # removing surrounding whitespace
    if key in results[-1]:
        # start a new dictionary
        results.append({})
    results[-1][key] = value

Проверяя наличие key, он больше не имеет значения, если запись Name и Indexменяли местами.

Демо:

>>> results = [{}]
>>> for entry in inputlist:
...     key, value = map(str.strip, entry.split(':'))  # removing surrounding whitespace
...     if key in results[-1]:
...         # start a new dictionary
...         results.append({})
...     results[-1][key] = value
...
>>> pprint(results)
[{'Index': '24', 'Name': 'volume_test_add_volume_to_cg_2019_03_07-12_21_37'},
 {'Index': '3', 'Name': 'volume_xx111'},
 {'Index': '4', 'Name': 'volume_xx11541'},
 {'Index': '6',
  'Name': 'Volume_test_add_volume_mandatory_params_2019_03_06-16_50_10'}]
0 голосов
/ 10 марта 2019

Мое решение следующее:

lista = ['Name: volume_test_add_volume_to_cg_2019_03_07-12_21_37', 'Index: 24', 
         'Name: volume_xx111', 'Index: 3', 
         'Name: volume_xx11541', 'Index: 4', 
         'Name: Volume_test_add_volume_mandatory_params_2019_03_06-16_50_10', 'Index: 6']
result = []

for n, item in enumerate(lista):
    if n % 2 == 0:
        result.append({'Name': item[item.find(':') + 2:],
                       'Index': lista[n + 1][lista[n + 1].find(':') + 2:]})
print(result)

С этим выводом:

[{'Name': 'volume_test_add_volume_to_cg_2019_03_07-12_21_37', 'Index': '24'}, {'Name': 'volume_xx111', 'Index': '3'}, {'Name': 'volume_xx11541', 'Index': '4'}, {'Name': 'Volume_test_add_volume_mandatory_params_2019_03_06-16_50_10', 'Index': '6'}]
...