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

2 投票
4 回答
1439 浏览
提问于 2025-04-17 12:48

我有三个列表,分别是:

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)]

撰写回答