【问题标题】:extract data from list with same key to dictionary?从具有相同字典键的列表中提取数据?
【发布时间】:2019-04-15 17:46:07
【问题描述】:

我在这里问过一个类似的问题,它有所帮助。但经过一些 QA 测试后,我注意到我的逻辑出现错误(python 新手)。我使用fabric 连接到远程linux 服务器来运行命令并收集数据。不幸的是,数据可以具有不同值的相同键。我想根据这些数据创建一个字典,对于那些具有相同键名的人,将所有值放入该键中。另外,我怎样才能在控制台上显示织物隐藏输出。

各种测试,涉及语法、defaultdict 和其他一些我在谷歌上发现但无法工作的东西

在远程服务器上执行的命令

bpimage_cmd = ssh_connect.run(rf"sudo /usr/openv/netbackup/bin/admincmd/bpimagelist -L -backupid {last_backup_image} -media | egrep -e 'Policy:' -e 'ID:' -e 'Client:'")

bpimage_cmd.stdout.split('\n')的输出

['Client:            hostname',
 'Backup ID:         hostname_1555217510',
 'Policy:            POLICY-ONE',
 'Proxy Client:      (none specified)',
 'Job ID:            4630072',
 'Data_Classification_ID: (none specified)',
 'Storage Lifecycle Policy:    SLP-DATA-Infinite',
 'Origin Master GUID:    (none specified)',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaax',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               @aaaar',
 ' ID:               L02460',
 ' ID:               L02512',
 '']

我用来转成字典的命令,

backup_client_info = dict(re.split(r":\s*",s.strip(),1) for s in bpimage_cmd.stdout.split('\n') if s.strip())

backup_client_info
{'Client': 'hostname',
 'Backup ID': 'hostname_1555217510',
 'Policy': 'POLICY-ONE',
 'Proxy Client': '(none specified)',
 'Job ID': '4630072',
 'Data_Classification_ID': '(none specified)',
 'Storage Lifecycle Policy': 'SLP-DATA-Infinite',
 'Origin Master GUID': '(none specified)',
 'ID': 'L02512'}

为什么它只保留一个“ID”对我来说很有意义,因为它需要在字典中是唯一的。

我希望将所有 ID 值放在一个键中,其中值不是 @aaa*,例如 'ID': 'L02512','L02460' 在这种情况下。

【问题讨论】:

    标签: linux python-3.x


    【解决方案1】:

    你可以做这样的事情。它很详细,因此您可以看到我采取的不同步骤。

    backup_client_info = {}
    
    # assume you are storing the split data into bpimage_cmd_split
    bpimage_cmd_split = bpimage_cmd.stdout.split('\n')
    
    for item in bpimage_cmd_split:
    
        # don't do anything if content is not valuable
        if len(item.strip()) == 0:
            continue
    
        # split the data and clean both key and value
        data_split = [s.strip() for s in item.split(':')]
    
        if data_split[0] == 'ID':
            if not '@aaa' in data_split[1]:
    
                # If ID is not in dict yet, add it as a list
                # If ID is already there, append to the list
                if data_split[0] not in backup_client_info:
                    backup_client_info[data_split[0]] = [data_split[1]]
                else:
                    backup_client_info[data_split[0]].append(data_split[1])    
        else:
             backup_client_info[data_split[0]] = data_split[1]    
    
    print(backup_client_info)
    

    输出

    {
       'Client':'hostname',
       'Backup ID':'hostname_1555217510',
       'Policy':'POLICY-ONE',
       'Proxy Client':'(none specified)',
       'Job ID':'4630072',
       'Data_Classification_ID':'(none specified)',
       'Storage Lifecycle Policy':'SLP-DATA-Infinite',
       'Origin Master GUID':'(none specified)',
       'ID':[
          'L02460',
          'L02512'
       ]
    }
    

    当您必须使用 ID 时,您只需加入 ', '.join(ID),您将得到一个逗号分隔的字符串。

    【讨论】:

    • @neoluu 我不明白这个问题。你能再问一次并提供一个你需要什么的例子吗?
    • 嗨 zedfoxus,太棒了,感谢您的详细介绍。而不是打印(backup_client_info)。我将使用 "if key in backup_client_info: backup_tape_id = backup_client_info.get("ID")。我得到这个输出,"['L02460', 'L02512']"。我想删除字符并使用了这个命令: backup_tape_id.replace('[','').replace(']','').replace("\'",'').strip(",") 输出:'L02460, L02512'。只是想知道,一定有更合适的方法吗?
    • 是的,你可以这样做if ID in backup_client_info: backup_tape_id = ', '.join(backup_client_info["ID"])。试试看。
    猜你喜欢
    • 2019-11-04
    • 2021-11-17
    • 2019-10-05
    • 2019-11-19
    • 2018-10-20
    • 2019-01-22
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多