使用不预先知道的字典

时间:2012-03-05 16:25:23

标签: python coding-style

我有一本字典,可能包含不同的内容,例如:

{"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"]

构建树状的try..except spaghetti是一种很好的编码风格吗?:)

UPD1 (@ strcat的)

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

4 个答案:

答案 0 :(得分:4)

您可以使用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"]))

答案 1 :(得分:3)

您可以使用dict.get方法作为更清洁的解决方案。

例如(如果您认为更具可读性,可以展开):

d.get("full_name", d["name"] + " " + d.get("surname", d["last_name"]))

答案 2 :(得分:2)

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)

答案 3 :(得分:2)

要做的好事可能是规范你的词典或将它们转换为对象。

  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))
    
  3. 根据您的实际代码,可能需要重新审视这些示例。