python列表元素平均值_请教:Python怎样最简洁的对一个list的不同元素分别取平均值?...

问 题

今天面试的时候,遇到一个很简单的问题,但是面试官要求最短的运行时间以及最简洁的写法。

假设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屋 ” ,选择关注与百万开发者在一起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值