понимание, чтобы изменить вложенный список в список словарей - PullRequest
0 голосов
/ 15 февраля 2019

Я массировал данные в структуру списка ...

[['keychain: "keychainname.keychain-db"', 
'version: 512', 
'class: 0x0000000F ', 
'attributes:\n   long string containing : and \n that needs to be split up into a list (by newline) of dictionaries (by regex and/or split() function) '], 
['keychain: "keychainname.keychain-db"', 
'version: 512', 
'class: 0x0000000F ', 
'attributes:\n   long string that needs to be split up '], 
['keychain: "keychainname.keychain-db"', 
'version: 512', 
'class: 0x0000000F ', 
'attributes:\n    long string that needs to be split up']]

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

['{'keychain': 'keychainname.db', 
'version': '512', 
'class': '0x0000000F', 
'attribute':\n   long string containing : and \n that needs to be split up into a dictionary (by newline) of dictionaries (by regex and/or split() function) '}']

Кажется, что работает следующий цикл for ...

newdata = []
for item in data:
    eachdict = {}
    for each in item:
        new = each.split(':', 1)
        eachdict[new[0]] = new[1]
        newdata.append(eachdict)

Но моя попытка понимания не ...

newdata = [[{key:value for item in data} for line in item] for key, value in (line.split(':', 1))]

Это понимание работает, но оно не 'я правильно вложил ...

newdata = [{key:value for item in data} for key, value in (item.split(':', 1),)]

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

Буду признателен за некоторые советы о том, как решить проблему.

Для бонусных баллов яВам также нужно разбить длинную строку внутри ключа атрибутов на словарь словарей.Я хотел бы иметь возможность ссылаться на клавишу 'Alis', клавишу 'labl' и так далее.Возможно, я смогу понять это самостоятельно, если сначала научусь использовать вложенные понимания в приведенном выше примере.

attributes:\n
    "alis"<blob>="com.company.companyvpn.production.vpn.5D5AF9C525C25350E9CD5CEBED824BFD60E42110"\n
    "cenc"<uint32>=0x00000003 \n
    "ctyp"<uint32>=0x00000001 \n
    "hpky"<blob>=0xB7262C7D5BCC976744F8CA6DE5A80B755622D434  "\\267&,}[\\314\\227gD\\370\\312m\\345\\250\\013uV"\\3244"\n
    "issu"<blob>=0x306E3128302606035504030C1F4170706C6520436F72706F726174652056504E20436C69656E7420434120313120301E060355040B0C1743657274696669636174696F6E20417574686F7269747931133011060355040A0C0A4170706C6520496E632E310B3009060355040613025553  "0n1(0&\\006\\003U\\004\\003\\014\\037Company Corporate VPN Client CA 11 0\\036\\006\\003U\\004\\013\\014\\027Certification Authority1\\0230\\021\\006\\003U\\004\\012\\014\\012Company Inc.1\\0130\\011\\006\\003U\\004\\006\\023\\002US"\n
    "labl"<blob>="com.company.companyvpn.production.vpn.5D5AF9C525C25350E9CD5CEBED824BFD60E42110"\n
    "skid"<blob>=0xB7262C7D5BCC976744F8CA6DE5A80B755622D434  "\\267&,}[\\314\\227gD\\370\\312m\\345\\250\\013uV"\\3244"\n    "snbr"<blob>=0x060A02F6F9880D69  "\\006\\012\\002\\366\\371\\210\\015i"\n
    "subj"<blob>=0x3061315F305D06035504030C56636F6D2E6170706C652E6973742E64732E6170706C65636F6E6E656374322E70726F64756374696F6E2E76706E2E35443541463943353235433235333530453943443543454245443832344246443630453432313130  "0a1_0]\\006\\003U\\004\\003\\014Vcom.company.companyvpn.production.vpn.5D5AF9C525C25350E9CD5CEBED824BFD60E42110"' 

Для контекста ...

Я использую вывод "securitydump-keychain "на Mac для создания хорошей структуры данных Python для поиска ключей.Параметр check_output этой команды представляет собой длинную строку с некоторым несовместимым форматированием и встроенными символами новой строки, которые мне необходимо очистить, чтобы получить данные в список словарей словарей.

Для тех, кто интересуется темами для администраторов Mac, этопоэтому мы можем удалить элементы, которые сохраняют пароль Active Directory при сбросе пароля AD, чтобы учетная запись не блокировалась, скажем, Outlook, представляя старый пароль Exchange снова и снова.

1 Ответ

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

Здесь может быть подход:

data = [['keychain: "keychainname.keychain-db"',  'version: 512',  'class: 0x0000000F ',  'attributes:\n   long string containing : and \n that needs to be split up into a list (by newline) of dictionaries (by regex and/or split() function) '],  ['keychain: "keychainname.keychain-db"',  'version: 512',  'class: 0x0000000F ',  'attributes:\n   long string that needs to be split up '],  ['keychain: "keychainname.keychain-db"',  'version: 512',  'class: 0x0000000F ',  'attributes:\n    long string that needs to be split up']]

result = [dict([item.split(':', 1) for item in items]) for items in data]

>>> [{'keychain': ' "keychainname.keychain-db"', 'version': ' 512', 'class': ' 0x0000000F ', 'attributes': '\n   long string containing : and \n that needs to be split up into a list (by newline) of dictionaries (by regex and/or split() function) '}, {'keychain': ' "keychainname.keychain-db"', 'version': ' 512', 'class': ' 0x0000000F ', 'attributes': '\n   long string that needs to be split up '}, {'keychain': ' "keychainname.keychain-db"', 'version': ' 512', 'class': ' 0x0000000F ', 'attributes': '\n    long string that needs to be split up'}]

split разбивает каждую отдельную строку на пару ключ-значение.Понимание внутреннего списка проходит через каждую пару ключ-значение в отдельном элементе.Понимание внешнего списка проходит через каждый элемент основного списка.

...