【问题标题】:How to combine multiple try and except in Python如何在 Python 中组合多个 try 和 except
【发布时间】:2021-04-24 03:15:01
【问题描述】:

我有一个列表,有时会包含一个值,有时会包含 2 或 3 个值。我将每个值分配给一个变量。如果列表的分配位置没有值,我希望它是一个空变量。有什么办法可以提高效率吗?

split = line.split(',')
try:
    var1 = split[0]
except IndexError:
    var1 = None
    
try:
    var2 = split[1]
except IndexError:
    var2 = None

try:
    var3 = split[2]
except IndexError:
    var3 = None

【问题讨论】:

  • 听起来像是dict 的用法。你不能使用dict 来存储这些值而不是将它们存储在单独的变量中吗?
  • 这能回答你的问题吗? Multiple try codes in one block
  • var1, var2, var3 = (split + [None] * 3)[:3].
  • 如果line 是一个字符串,split[0] 将永远存在。那么您期待IndexError 有什么原因吗?例如,''.split(',') -> ['']

标签: python list


【解决方案1】:
split = line.split(',')
variables = [None, None, None]


for i in range(len(split)):
        variables[i] = split[i]

var1, var2, var3 = variables

编辑(在@ekhumoro 之后):

split = line.split(',')
variables = [None, None, None]
variables[:len(split)] = split
var1, var2, var3 = variables

【讨论】:

【解决方案2】:

根据您实际想要完成的任务*,最好使用单个变量。例如,您可以使用dict.get(),如果给定的键不在字典中,则返回None

for line in 'a,b,c', 'd,e', 'f':
    split = line.split(',')
    d = {i: v for i, v in enumerate(split)}
    print(d, ' -> ', d.get(0), d.get(1), d.get(2))

输出:

{0: 'a', 1: 'b', 2: 'c'}  ->  a b c
{0: 'd', 1: 'e'}  ->  d e None
{0: 'f'}  ->  f None None

你也可以考虑使用解包:

for line in 'a,b,c', 'd,e', 'f':
    var1, *others = line.split(',')
    print(var1, others)

输出:

a ['b', 'c']
d ['e']
f []

顺便说一句,请注意split[0] 将始终存在,所以我不确定您为什么期待IndexError。例如:

>>> ''.split(',')
['']

* 在How do I create variable variables? 和更广泛的how to avoid the XY problem 上查看一些相关想法

【讨论】:

    【解决方案3】:

    您可以使用生成器表达式(或列表推导)进行条件检查以查看索引是否存在于列表中。如果存在,则返回该索引处的元素,否则返回None。在这里,我将我的 生成器表达式 限制为返回 n(在您的情况下为 3)值,您可以将这些值解包并保存在 n 变量中。

    例如:

    my_list = [1] # List with just one element
    n = 3  # Number of variables in which you want to fill the values
    
    var1, var2, var3 = (my_list[i] if i < len(my_list) else None for i in range(n))
    
    print(var1, var2, var3)
    # prints: (1, None, None)
    

    更多详情请参考Generator Expressions and List Comprehensions

    【讨论】:

    • @pcct2019 这个答案和其他答案对您有帮助吗?如果是,请点击答案左侧的“向上”箭头,为答案投票。您还可以通过点击“勾选”图标将最佳答案标记为已接受。它可以帮助回答者获得 +10 的声望和 +15 的接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2019-06-26
    相关资源
    最近更新 更多