Работа с неизвестным словарем - PullRequest
1 голос
/ 05 марта 2012

У меня есть словарь, который может содержать различное содержимое, например:

{"name": "Dmitry", "surname": "Pak"}
{"full_name": "John Smith"}
{"name": "Joe", "last_name": "Smith"}

Мне нужно напечатать полное имя пользователя.Я вижу следующее решение:

try:
    print dic["full_name"]
except:
    try:
        print dic["name"]+" "+dic["surname"]
    except:
        print dic["name"]+" "+dic["last_name"]

Является ли это хорошим стилем кодирования для создания древовидной попытки ... кроме спагетти? :)

UPD1 (@ strcat)

print dic.get("full_name",dic.get("name", "DefaultName")+" "+dic.get("last_name",dic.get("surname", "DefaulSurname")))

Ответы [ 4 ]

4 голосов
/ 05 марта 2012

Вы можете использовать ключевое слово in для проверки наличия ключа в словаре:

if "full_name" in dic:
     ... do something

Используя это, ваш код может выглядеть так:

if "full_name" in dic:
    print dic["full_name"]
elif "surname" in dic:
    print dic["name"]+" "+dic["surname"]
else:
    print dic["name"]+" "+dic["last_name"]

И, конечно, вы можете сделать его одним вкладышем:

print dic["full_name"] if "full_name" in dic \
 else (dic["name"] + " " + (dic["surname"] if "surname" in dic else dic["last_name"]))
3 голосов
/ 05 марта 2012

Вы можете использовать метод dict.get в качестве более чистого раствора.

Например (может быть распространено, если вы считаете, что это более читабельно):

d.get("full_name", d["name"] + " " + d.get("surname", d["last_name"]))
2 голосов
/ 05 марта 2012

Хорошо бы нормализовать словари или преобразовать их в объекты.

  1. Нормализовать словари:

    dicts = [{"name": "Dmitry", "surname": "Pak"},
             {"full_name": "John Smith"},
             {"name": "Joe", "last_name": "Smith"}]
    
    for dct in dicts:
        if "full_name" not in dct:
            dct["full_name"] = "{} {}".format(dct["name"], dct.get("surname") or dct.get("last_name", ""))
    
  2. Используйте объекты вместо словарей:

    class Person(object):
         def __init__(self, name, surname):
             self.name = name
             self.surname = surname
         @property
         def full_name(self):
             return "{self.name} {self.surname}".format(self=self)
    

    И сделайте одно из двух: преобразуйте свои словари в объекты Person или используйте их напрямую.
    Чтобы преобразовать их, может сделать что-то подобное:*

    people = []
    for dct in dicts:
        if "full_name" in dct:
            name, surname = dct["full_name"].split()
        else:
            name = dct["name"]
            surname = dct.get("surname") or dct.get("last_name", "")
        people.append(Person(name, surname))
    

Исходя из вашего фактического кода, эти примеры, возможно, придется немного пересмотреть.

2 голосов
/ 05 марта 2012
if "full_name" in dic.keys() :
    print "Full Name : "+str(dic["full_name"])
else :
     name = dic["name"]
     list = ["surname","lastname"]
     if any(key in dic.keys() for key in list):
             ls = list(set(dic.keys()) - (set(dic.keys()) - set(list)))
             name += " "+ str(dic[ls])

     print "Full Name : "+str(name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...