python中的内联错误/异常处理

时间:2012-02-10 21:42:43

标签: python list inline lambda

所以,我有3个列表如下:

list_1 = ['a','b','c'] 
list_2 = ['b','c']
list_3 = [5,4]

我希望从list_2&中生成第四个值列表。 list_3将映射到list_1。 list_2和list_3独立于list_1,但是是list_1的子集,并且相互映射。即list_2和list_3缺少项'a'和相应的值。

我想处理缺失值并指定一些值,即0或空字符串。我想用内联函数来做这件事。到目前为止,我已经尝试了以下但它失败了。我做错了什么?

list_4 =[lambda i:list_3[list_2.index(list_1[i])] except "" for i in range(len(list_1))]

我的最终结果应如下所示:

list_4=[0,5,4]

4 个答案:

答案 0 :(得分:2)

为什么不检查是否存在值,而不是依赖于异常处理?

list_4 = [(list_3[list_2.index(item)] if item in list_2 else 0) for index,item in enumerate(list_1)]

答案 1 :(得分:2)

更有效的方式来做你想做的事:

dict_2_to_3 = dict(zip(list_2, list_3))
list_4 = [dict_2_to_3.get(i, 0) for i in list_1]
  • dict对查找效率更高
  • .get()功能可让您为未找到的内容指定默认值。

答案 2 :(得分:2)

你不能内联“除了”那样;他们只是在尝试/除了对,而那些不能在lambda中完成。

除非这是家庭作业或谜题,否则我会使用字典:

>>> list_1 = ['a','b','c'] 
>>> list_2 = ['b','c']
>>> list_3 = [5,4]
>>> 
>>> mymap = dict(zip(list_2, list_3))
>>> list_4 = [mymap.get(x,0) for x in list_1]
>>> list_4
[0, 5, 4]

zip将两个列表组合成一对:

>>> zip(list_2, list_3)
[('b', 5), ('c', 4)]

dict生成一个字典(关联数组):

>>> mymap = dict(zip(list_2, list_3))
>>> mymap
{'c': 4, 'b': 5}
>>> mymap['c']
4
>>> mymap['b']
5

和字典上的.get(a,b)方法意味着“查找键a并返回该值,但如果未找到键,则返回b。”

>>> mymap.get("c", 0)
4
>>> mymap.get("nope", 0)
0

答案 3 :(得分:1)

根据您使用的Python版本,可能尚未包含list.enumerate()。枚举仍然作为内置存在,并将返回(index,item)的元组。所以你要找的那条线是:

list_4 = [(list_3[list_2.index(item)] if item in list_2 else 0) for index,item in enumerate(list_1)]