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

时间:2018-03-12 00:53:00

标签: python dictionary removing-whitespace

 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'}

        ]

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

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

Mr Tom Frank以及安妮和大卫之间,我的尝试将在汤姆和弗兰克之间留出一个额外的空间。这是实际输出

[('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

3 个答案:

答案 0 :(得分:0)

您可以使用正则表达式:

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

答案 1 :(得分:0)

数据的“firstname”条目似乎有一个尾随空白。您可以使用strip返回的字符串的record.get()方法修剪此前导和尾随空格。这将使您的列表理解线为:

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

容忍额外的空格。

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

答案 2 :(得分:0)

这些代码似乎正在添加一行代码,如下所示:

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

其余部分并不需要任何改变。 这可能是冗长的,但它正在发挥作用。达到相同结果的最佳方法是什么?