我有一本字典,可能包含不同的内容,例如:
{"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")))
答案 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)
要做的好事可能是规范你的词典或将它们转换为对象。
规范你的词典:
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", ""))
使用对象而不是字典:
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))
根据您的实际代码,可能需要重新审视这些示例。