2017-05-05 61 views
0

我有一个通常包含项目但有时为空的列表。Python - 列表索引超出if语句的范围

列表中的三项添加到数据库中,但如果它是空的,则会遇到错误,即使我正在使用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陈述?)

+1

我很想知道你在哪里看,你不应该使用'else'语句。你能提供一个来源吗? –

+0

@AustinHastings没有单一的来源,只是通过评论这是不好的做法。 – Sen

回答

2

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

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

,你可以得到你所期望通过这样的结果:

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

这行代码创建了一个包含在item_list串联和列表(3减去item_list大小)“未知的临时列表“串;这总是一个3项列表。然后,它unpacks此列表中onetwothree变量


细节:

  • 您可以乘列表,以获得与重复的项目更大的列表:['a', 1, None] * 2['a', 1, None, 'a', 1, None]。这用于创建“未知”字符串的列表。请注意,将列表乘以0会导致一个空列表(如预期的那样)。
  • 可以使用加法运算符连接2个(或更多)列表:['a', 'b'] + [1, 2]给出['a', 'b', 1, 2]。这用于从item_list和乘法创建的“未知”列表创建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') 
+0

完美,谢谢!你有没有资源可以学习内联/压缩的风格(即'1,2,3 = item_list + [“unknown”] *(3-len(item_list))'')。我不太清楚你会怎么称呼它 – Sen

+0

@Sen:我刚刚添加了关于使用机制的详细信息,但无法找到每个文档。我不知道任何资源教学写紧凑的代码。请记住,紧凑的代码并不总是一件好事,特别是如果它使代码难以理解。如果您想了解更多有关语言的“技巧”,请参考[官方Python教程](https://docs.python.org/3/tutorial/index.html) – Tryph

+0

感谢您的超级宝贵信息!我已经完成了教程,但我仍然在学习:)对不起,如果我要求很多,但是可以使用上述('一,二,三= item_list + [“未知”] *(3 - (item_list))')列表中的列表(?)(所以'item_list = [(“Get this string”,23),(“Get this string too”,52)]''如果我使用'one,two ,3 = item_list + [“unknown”] *(3-len(item_list))'在这种情况下,它返回'one =(“Get this string”,23)'而不是'one =“获取该字符串”' – Sen

0

item_list[1]将立即提出一个错误,如果没有列表中的2个元素;该行为不像Clojure这样的语言,而是返回空值。

改为使用len(item_list) > 1

2

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" 
0

你需要检查,如果你的列表足够长,以便在你正试图从检索索引位置的值。如果您还试图避免在条件语句中使用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]