问 题
今天面试的时候,遇到一个很简单的问题,但是面试官要求最短的运行时间以及最简洁的写法。
假设list1 = ["张三", "张三", "王五", "张三", "李四"]; list2 = [10, 15, 1, 20, 99]; 所以张三的值是10、15、20(平均值是15),李四的值是99(平均值是99),王五飘过。
题目要求输出也是一个长度为4的list3,它的元素和list1对应,写成[15, 15, 1, 15, 99]。
我第一反应是遍历,然后建立字典,储存所有list1中的不同元素的下标,然后去list2里找对应的数值。但是我觉得这个办法有点笨。
dict=defaultdict(list); mapping={}; list3=[]
for index, item in enumerate(list1):
dict[item].append(index) # 生成一个字典 {张:[0,1,3];李:[4];王:[2]}
for key in dict.iterkeys():
sum = 0; av=0
for element in dict[key]:
sum += list2[element];
av = sum / len(dict[key])
mapping[key] = av # 生成另一个字典 {张:15;李:99;王:1}
for index, item in enumerate(list1):
list3.append(mapping[item]) # 遍历list1来生成list3
面试官问:“假设有一个数值的list4=[10, 20, 30, 40, 50],另有一个下标的list5=[0, 2, 4],要求根据list5找出list4[0]、list4[2]、list4[4]的总和,除了像刚才那样遍历,还有其他方法吗?” 我一时语塞。
所以请教一下大家:
1 把list1中的张、王、李对应的list2中的数值取出,再生成和list1对应的list3,除了像刚才那样建立字典,还有简单其他方法吗?用zip和izip么?
2 把数值list4的元素根据下标list5取出并且运算,除了像刚才那样建立遍历,还有简单其他方法吗?
谢谢了先!
解决方案
估计面试官是在考你groupby和map的用法
#第一问
from itertools import groupby
list1 = ["张三", "张三", "王五", "张三", "李四"]
list2 = [10, 15, 1, 20, 99]
data = sorted(zip(list1, list2))
d = dict()
for k, g in groupby(data, key=lambda x: x[0]):
lst = [v for k, v in g]
d[k] = sum(lst)//len(lst)
list3 = map(lambda x: d[x], list1)
print list3
#第二问
list4 = [10, 20, 30, 40, 50]
list5 = [0, 2, 4]
print sum(map(lambda x: list4[x], list5))
扫一扫关注IT屋
微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起