2012-03-05 49 views
1

工作,我有一本字典,其中可能包含不同的内容,例如:有没有预先知道字典

{"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意大利面条:)

UPD1(@strcat)

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

回答

4

您可以使用关键字来检查重点是存在于词典:

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"])) 
+2

执行此答案:“has_key(key)测试字典中密钥的存在has_key()已弃用,以d中的密钥为准。直接从pydoc中获取。所以如果字典中的“fullname”:elif“名字”在字典elif等等! – 2012-03-05 16:31:19

3

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

例如(如果你认为这是更具可读性可以摊开):

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

你可以加入一些代码来说明如何适用于这种情况吗? – Gabe 2012-03-05 16:32:01

+0

我加了代码示例,thx! – dizpers 2012-03-05 16:34:32

+0

我认为,这种方法满足我的需要:) – dizpers 2012-03-05 16:38:20

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) 
+0

有趣的解决方案,thx! – dizpers 2012-03-05 16:37:49

+0

随时待命.. !!! :) – 2012-03-05 16:39:18

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)) 
    

根据您的实际代码,这些例子可能需要重新一点点。