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 这个列表在 one
、two
和 three
变量中
详情:
- 您可以将列表相乘以获得包含重复项的更大列表:
['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]
我有一个列表,通常包含项目但有时是空的。
列表中的三个项目已添加到数据库中,但如果它为空,我 运行 就会出错,即使我使用的是 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
语句?)
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 这个列表在 one
、two
和 three
变量中
详情:
- 您可以将列表相乘以获得包含重复项的更大列表:
['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]