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它可以工作。。!!