根据条件查询字典并跳过缺少的值
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 方法是什么?
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 方法是什么?