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
答案 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 ]
其余部分并不需要任何改变。 这可能是冗长的,但它正在发挥作用。达到相同结果的最佳方法是什么?