Python中的内联错误/异常处理
我有三个列表,分别是:
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 个回答
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
你不能像那样把“except”放在一行里;它们只能成对出现,必须和try一起使用,而这些不能在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
2
你为什么不先检查一下这个值是否存在,而不是依赖于异常处理呢?
list_4 = [(list_3[list_2.index(item)] if item in list_2 else 0) for index,item in enumerate(list_1)]