Python 使用未知词典
我有一本字典,可能包含不同的内容,例如:Python 使用未知词典,python,coding-style,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"] exce
{"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.一样构建树是一种好的编码方式吗?:)
UPD1(@strcat)
您可以使用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"]))
您可以使用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"]))
您可以将该方法用作更清洁的解决方案
例如(如果你认为这更具可读性,可以分散开来):
您可以将该方法用作更清洁的解决方案
例如(如果你认为这更具可读性,可以分散开来):
一个好办法可能是规范化您的字典或将其转换为对象
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)
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))
根据您的实际代码,这些示例可能需要重新讨论一下。一个好办法可能是规范化您的词典或将它们转换为对象
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)
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))
根据您的实际代码,这些示例可能需要重新讨论一下。强制执行以下回答:“has_key(key)测试字典中是否存在key。has_key()不推荐使用,而赞成使用d中的key。”直接取自pydoc。所以如果dict中的“全名”:elif dict中的“name”elif等等!强制执行这个答案:“has_key(key)测试字典中是否存在key。has_key()被弃用,取而代之的是d中的key。”直接取自pydoc。所以如果dict中的“全名”:elif dict中的“name”elif等等!你能提供一些代码来说明它是如何应用于这种情况的吗?我想,这种方法满足了我的需要:)但在我的解决方案中,你实际上可以在列表中放入任意数量的字符串..比如“sirname”,“last_name”等..n它可以工作。。!!你能提供一些代码来说明它是如何应用于这种情况的吗?我想,这种方法满足了我的需要:)但在我的解决方案中,你实际上可以在列表中放入任意数量的字符串..比如“sirname”,“last_name”等..n它可以工作。。!!