【问题标题】:comprehension to change nested list to list of dictionaries理解将嵌套列表更改为字典列表
【发布时间】:2019-02-15 16:54:20
【问题描述】:

我已将数据按摩到列表结构中……

[['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 提供旧密码所锁定一遍又一遍。

【问题讨论】:

  • 列表理解是解决这个问题的正确方法吗?为了便于阅读,最好坚持您当前的工作for loop
  • (1) 我正在努力学习理解,并且 (2) 我喜欢在将原始数据字符串按摩成可用的东西时为每个转换使用离散的单个步骤。至于可读性,我会在这里注意您的明智谨慎,并尝试清楚地记录 cmets 中的步骤,以便在此过程中解释文本修改。

标签: python list dictionary list-comprehension dictionary-comprehension


【解决方案1】:

这可能是一种方法:

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 将每个单独的字符串分解为一个键值对。 内部列表理解循环遍历单个项目中的每个键、值对。外部列表理解循环遍历主列表中的每个项目。

【讨论】:

  • 谢谢!看起来我通过尝试使用“key:value for key, value”而不是让理解自动创建正确的结构来使其过于复杂?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2017-06-17
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多