python开发岗笔试题:
小学春游 - 两组同学,每组1-3人,每组有一个队长;春游期间,由于景点人数较多,秩序混乱,班主任要求在指定地点,按组集合
#源数据
s = [{'name':'leader-1','belong_to':None},{'name':'jack','belong_to':'leader-2'},{'name':'lili','belong_to':'leader-1'},{'name':'leader-2','belong_to':None},{'name':'Tom', 'belong_to':'leader-1'}]
#目标数据
d = [
{'name':'leader-1', 'team':[{'name':'lili'},{'name':'Tom'}]},
{'name':'leader-2', 'team':[{'name':'jack'}]}
]
请用python代码实现分组:
1先把数组里的字典遍历出来,如果字典里的belong_to存在,就把这个belong_to 的值作为key初始化一个我们需要的字典样式
def find_team(data):leader_lst = []
s_dict = {}
for d in data:
if d['belong_to']:
s_dict.setdefault(d['belong_to'],[])
print(s_dict)
find_team(s)
运行结果:
{'leader-2': [], 'leader-1': []}
2再次分析原始数据:
s = [{'name':'leader-1','belong_to':None},{'name':'jack','belong_to':'leader-2'},{'name':'lili','belong_to':'leader-1'},{'name':'leader-2','belong_to':None},{'name':'Tom', 'belong_to':'leader-1'}]for i in s:
print(i)
结果:
{'name': 'leader-1', 'belong_to': None}
{'name': 'jack', 'belong_to': 'leader-2'}
{'name': 'lili', 'belong_to': 'leader-1'}
{'name': 'leader-2', 'belong_to': None}
{'name': 'Tom', 'belong_to': 'leader-1'}
通过遍历,我们获得了一个一个的字典,如果我要把name值从字典你里取出来,应该是这样的:
for d in s:print(d['name'])
3有了上面基础分析后我们就可以组装数据了
已知我们已经通过方法s_dict.setdefault(d['belong_to'],[]),定义出来了我们想要的样式:
s_dict = {'leader-2': [], 'leader-1': []}
那么我要实现 {'leader-2': ['name':'lily'], 'leader-1': ['Tom']}这样的效果,只需要:
s_dict['d['belong_to']'].append({'name':d['name']})
def find_team(data):leader_lst = []
s_dict = {}
for d in data:
if d['belong_to']:
s_dict.setdefault(d['belong_to'],[])
s_dict['d['belong_to']'].append({'name':d['name']})
print(s_dict)
find_team(s)
运行结果:
{'leader-2': [{'name': 'jack'}], 'leader-1': [{'name': 'lili'}, {'name': 'Tom'}]}
通过以上3步我们就把同学分组成功啦,如果字典里的belong_to不存在,那么这个人肯定就是队长啦,那么我们就组装我们需要的数据格式:leader_lst = [{'name':'leader-1', 'team':[]},{'name':'leader-2', 'team':[]}]
def find_team(data):leader_lst = []
s_dict = {}
for d in data:
if d['belong_to']:
s_dict.setdefault(d['belong_to'],[])
s_dict[d['belong_to']].append({'name':d['name']})
else:
leader_lst.append({'name':d['name'],'team':[]})
print(s_dict)
print(leader_lst)
find_team(s)
结果:
#s_dict
{'leader-2': [{'name': 'jack'}], 'leader-1': [{'name': 'lili'}, {'name': 'Tom'}]}
#leader_lst
[{'name': 'leader-1', 'team': []}, {'name': 'leader-2', 'team': []}]
4拼装数据完成最终想要的效果:
#目标数据d = [
{'name':'leader-1', 'team':[{'name':'lili'},{'name':'Tom'}]},
{'name':'leader-2', 'team':[{'name':'jack'}]}
]
先循leader_lst,如果leader_lst里的['name']值在字典s_dict里,那么就就把s_dict里的name值取出来放到leader_lst里,即:
for l in leader_lst:if l['name'] in s_dict:
l['team'] = s_dict[l['name']]
解释:
因为我们事先定义了s_dict = { },所以
s_dict[l['name']] == {‘name’:l['name']] }
最终程序代码:
def find_team(data):leader_lst = []
s_dict = {}
for d in data:
if d['belong_to']:
s_dict.setdefault(d['belong_to'],[])
s_dict[d['belong_to']].append({'name':d['name']})
else:
leader_lst.append({'name':d['name'],'team':[]})
for l in leader_lst:
if l['name'] in s_dict:
l['team'] = s_dict[l['name']]
return leader_lst
print(find_team(s))
结果:
[{'name': 'leader-1', 'team': [{'name': 'lili'}, {'name': 'Tom'}]}, {'name': 'leader-2', 'team': [{'name': 'jack'}]}]