Python Словарь: возвращение первого значения в списке или строке - PullRequest
3 голосов
/ 20 марта 2020

У меня есть список словарей, в которых я пытаюсь сделать значение ключа «Имя пользователя» в качестве ключа в новом словаре, и последующие пары ключ-значение в качестве значения словаря для ключа «Имя пользователя» в новый словарь.

Одна из проверок включает в себя возврат первого элемента из списка, если значение GECOS является списком, в противном случае возвращается строковое значение ключа GECOS.

Для первых двух словарей я не могу получить всю строку.

У меня есть данные ниже:

test_list = [
    {
        "Username": "root",
        "UID": "0",
        "GECOS": "root",
        "Group List": [
            ""
        ]
    },
    {
        "Username": "daemon",
        "UID": "1",
        "GECOS": "daemon",
        "Group List": [
            ""
        ]
    },
    {
        "Username": "hplip",
        "UID": "118",
        "GECOS": [
            "HPLIP system user",
            "",
            "",
            ""
        ],
        "Group List": [
            ""
        ]
    },
    {
        "Username": "speech-dispatcher",
        "UID": "111",
        "GECOS": [
            "Speech Dispatcher",
            "",
            "",
            ""
        ],
        "Group List": [
            "pulse",
            "test"
        ]
    }    
]

и следующий код:

import json
new_dict = {}
for dict_item in test_list:
    for key in dict_item:
        new_dict[dict_item["Username"]] = {
            'UID'.title().lower(): dict_item['UID'], 
            'GECOS'.title(): dict_item['GECOS'][0] if isinstance(dict_item[key], list) else dict_item['GECOS'],
            'Group List'.title(): [] if all('' == s or s.isspace() for s in dict_item['Group List']) else dict_item['Group List'] 
        }
print(json.dumps(new_dict, indent=4))

Вывод этого:

{
    "root": {
        "uid": "0",
        "Gecos": "r",
        "Group List": []
    },
    "daemon": {
        "uid": "1",
        "Gecos": "d",
        "Group List": []
    },
    "hplip": {
        "uid": "118",
        "Gecos": "HPLIP system user",
        "Group List": []
    },
    "speech-dispatcher": {
        "uid": "111",
        "Gecos": "Speech Dispatcher",
        "Group List": [
            "pulse",
            "test"
        ]
    }
}

И ожидаемый вывод:

{
    "root": {
        "uid": "0",
        "Gecos": "root",
        "Group List": []
    },
    "daemon": {
        "uid": "1",
        "Gecos": "daemon",
        "Group List": []
    },
    "hplip": {
        "uid": "118",
        "Gecos": "HPLIP system user",
        "Group List": []
    },
    "speech-dispatcher": {
        "uid": "111",
        "Gecos": "Speech Dispatcher",
        "Group List": [
            "pulse",
            "test"
        ]
    }
}

1 Ответ

3 голосов
/ 20 марта 2020

Вы не должны перебирать ключи каждого диктанта. Вместо этого обращайтесь к ключам напрямую, как диктует:

import json
new_dict = {}
for dict_item in test_list:
    new_dict[dict_item["Username"]] = {
        'UID'.title().lower(): dict_item['UID'],
        'GECOS'.title(): dict_item['GECOS'][0] if isinstance(dict_item['GECOS'], list) else dict_item['GECOS'],
        'Group List'.title(): [] if all('' == s or s.isspace() for s in dict_item['Group List']) else dict_item['Group List']
    }
print(json.dumps(new_dict, indent=4))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...