理解将嵌套列表更改为字典列表
comprehension to change nested list to list of dictionaries
我已经将数据按摩到列表结构中……
[['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"'
对于上下文…
我在 Mac 上使用 "security dump-keychain" 的输出来创建一个很好的 Python 数据结构来查找键。此命令的 check_output 是一个长字符串,具有一些不一致的格式和嵌入的换行符,我需要清理这些字符串以将数据放入字典列表中。
对于那些对 Mac 管理主题感兴趣的人,这样我们就可以在重置 AD 密码时删除保存 Active Directory 密码的项目,这样帐户就不会被 Outlook 等锁定一遍又一遍地向 Exchange 出示旧密码。
这里可能有一个方法:
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
将每个单独的字符串分解为键值对。
内部列表理解循环遍历单个项目中的每个键值对。外部列表理解循环遍历主列表中的每个项目。
我已经将数据按摩到列表结构中……
[['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"'
对于上下文…
我在 Mac 上使用 "security dump-keychain" 的输出来创建一个很好的 Python 数据结构来查找键。此命令的 check_output 是一个长字符串,具有一些不一致的格式和嵌入的换行符,我需要清理这些字符串以将数据放入字典列表中。
对于那些对 Mac 管理主题感兴趣的人,这样我们就可以在重置 AD 密码时删除保存 Active Directory 密码的项目,这样帐户就不会被 Outlook 等锁定一遍又一遍地向 Exchange 出示旧密码。
这里可能有一个方法:
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
将每个单独的字符串分解为键值对。
内部列表理解循环遍历单个项目中的每个键值对。外部列表理解循环遍历主列表中的每个项目。