根据条件查询字典并跳过缺少的值

Query dictionary based on a criteria and skip values that are missing

 data = [
        {'firstname': 'Tom ', 'lastname': 'Frank', 'title': 'Mr',
         'education': 'B.Sc'},{'firstname': 'Anne ', 'middlename': 'David', 'lastname': 'Frank', 'title': 'Doctor',
         'education': 'Ph.D'} , {'firstname': 'Ben ', 'lastname': 'William', 'title': 'Mr'}

        ]

我想根据关键字'education'查询字典列表。如果此人的详细信息没有此键,则整个字典将被传递 over.The 所需的输出是

[(' Mr Tom Frank', 'B.Sc'),
 ('Doctor Anne David Frank', 'Ph.D') ]

我的尝试会在 Tom 和 Frank 之间以及在 Mr Tom Frank 以及 Anne 和 David 之间增加一个额外的 space。这是实际输出

[('Mr Tom   Frank', 'B.Sc'), ('Doctor Anne  David Frank', 'Ph.D')]

我想尽可能避免这种情况。 这是我写的代码。如果代码看起来不够可读,我深表歉意,我愿意接受任何评论。

def qualified_applicants(data):
    full_name_education=[ ]
    keys = ['title','firstname','middlename','lastname']
    for record in data:  
        #check to see if 'education' is one of the key 
        if 'education' in record.keys(): 
            full_name=[' '.join([record.get(key,'') for key in keys])]
            # make a tuple of education and full names
            full_name_education.append(tuple(full_name+[record['education']]))
    return full_name_education

您可以使用正则表达式:

import re
data = [
    {'firstname': 'Tom ', 'lastname': 'Frank', 'title': 'Mr',
     'education': 'B.Sc'},{'firstname': 'Anne ', 'middlename': 'David', 'lastname': 'Frank', 'title': 'Doctor',
     'education': 'Ph.D'} , {'firstname': 'Ben ', 'lastname': 'William', 'title': 'Mr'}

    ]
new_data = [(re.sub('\s{2,}', ' ', ' '.join(re.sub('\s+$', '', i.get(b, '')) for b in ['title', 'firstname', 'middlename', 'lastname'])), i['education']) for i in data if 'education' in i]

输出:

[('Mr Tom Frank', 'B.Sc'), ('Doctor Anne David Frank', 'Ph.D')]

您数据的 'firstname' 个条目似乎有尾随空白。您可以使用 record.get() 返回的字符串的 strip 方法 trim 这样的前导和尾随白色 space。这将使您的列表理解线成为:

 full_name = [' '.join([record.get(key,'').strip() for key in keys])]

能容忍多白space。

FWIW,我认为 full_name 不是列表而是纯字符串可能会更好。

这些代码似乎可以通过添加一行代码来工作,如下所示:

temp=[' '.join(record.get(key,'') for key in keys)]
full_name=[' '.join(full_name.split() ) for full_name in temp ]

其余的行不需要任何更改。 这可能很冗长,但它正在工作。达到相同结果的最 pythonic 方法是什么?