今天面试的时候,遇到一个很简单的问题,但是面试官要求最短的运行时间以及最简洁的写法。
假设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的用法