Python - 在 if 语句中列出超出范围的索引

Python - list index out of range in if statement

我有一个列表,通常包含项目但有时是空的。

列表中的三个项目已添加到数据库中,但如果它为空,我 运行 就会出错,即使我使用的是 if 语句。

if item_list[0]:
    one = item_list[0]
else:
    one = "Unknown"

if item_list[1]:
    two = item_list[1]
else:
    two = "Unknown"

if item_list[2]:
    three = item_list[2]
else:
    three = "Unknown"

如果列表为空,这仍然会引发 list index out of range 错误。我找不到任何其他方法可以完成它,但必须有更好的方法(我还读到你应该避免使用 else 语句?)

如果列表中没有 2 个元素,

item_list[1] 将立即引发错误;该行为与 Clojure 等语言不同,后者返回的是空值。

改用len(item_list) > 1

如果列表为空,则该列表没有索引;并尝试访问列表的索引会导致错误。

错误实际上发生在if语句中。

您可以通过这样做获得您期望的结果:

one, two, three = item_list + ["unknown"] * (3 - len(item_list))

这行代码创建了一个临时列表,其中包含 item_list 和(3 减去 item_list 的大小)"unknown" 个字符串的串联;这始终是一个 3 项列表。然后 unpacks 这个列表在 onetwothree 变量中


详情:

  • 您可以将列表相乘以获得包含重复项的更大列表:['a', 1, None] * 2 给出 ['a', 1, None, 'a', 1, None]。这用于创建 "unknow" 字符串列表。请注意,将列表乘以 0 会得到一个空列表(正如预期的那样)。
  • 您可以使用加法运算符连接 2 个(或更多)列表:['a', 'b'] + [1, 2] 给出 ['a', 'b', 1, 2]。这用于从 item_list 和乘法创建的 'unknown' 列表创建一个 3 项列表。
  • 您可以使用赋值运算符 unpack 多个变量中的列表:a, b = [1, 2] 给出 a = 1 and b = 2。它甚至可以使用扩展解包 a, *b = [1, 2, 3] 给出 a = 1 and b = [2, 3].

示例:

>>> item_list = [42, 77]
>>> one, two, three = item_list + ["unknown"] * (3 - len(item_list))
>>> one, two, three
(42, 77, 'unknown')
如果您尝试访问不存在的数组元素,

Python 将抛出此错误。所以一个空数组不会有索引 0.

if item_list:     # an empty list will be evaluated as False
    one = item_list[0]
else:
    one = "Unknown"

if 1 < len(item_list):
    two = item_list[1]
else:
    two = "Unknown"

if 2 < len(item_list):
    three = item_list[2] 
else:
   three = "Unknown"

您需要检查您的列表是否足够长,以便在您尝试从中检索的索引位置有一个值。如果您还试图避免在条件语句中使用 else,则可以使用默认值预先分配变量。

count = len(item_list)
one, two, three = "Unknown", "Unknown", "Unknown"
if count > 0:
    one = item_list[0]
if count > 1:
    two = item_list[1]
if count > 2:
    three = item_list[2]