如果列表索引存在,请执行X.

use*_*317 115 python python-2.7

在我的程序中,用户输入数字n,然后输入n字符串数,这些字符串存储在列表中.

我需要编写代码,如果存在某个列表索引,则运行一个函数.

由于我已经嵌套if语句,因此这变得更加复杂len(my_list).

这是我现在拥有的简化版本,它不起作用:

n = input ("Define number of actors: ")

count = 0

nams = []

while count < n:
    count = count + 1
    print "Define name for actor ", count, ":"
    name = raw_input ()
    nams.append(name)

if nams[2]: #I am trying to say 'if nams[2] exists, do something depending on len(nams)
    if len(nams) > 3:
        do_something
    if len(nams) > 4
        do_something_else

if nams[3]: #etc.
Run Code Online (Sandbox Code Playgroud)

小智 135

您是否可以使用列表的长度len(n)来通知您的决定而不是检查n[i]每个可能的长度?

  • 是的.在查看代码后,我的设置完全是多余的; len(n)完成了我需要的一切.谢谢你指出了正确的方向. (4认同)
  • 这不考虑负指数。我知道的最好的方法是 try / except IndexError,但最好有一个简洁的方法来获取 bool (2认同)

daw*_*awg 80

我需要编写代码,如果存在某个列表索引,则运行一个函数.

这是try块的完美用法:

ar=[1,2,3]

try:
    t=ar[5]
except IndexError:
    print('sorry, no 5')   

# Note: this only is a valid test in this context 
# with absolute (ie, positive) index
# a relative index is only showing you that a value can be returned
# from that relative index from the end of the list...
Run Code Online (Sandbox Code Playgroud)

然而,根据定义,在两者之间一个Python列表中的所有项目0len(the_list)-1存在(即,没有必要一试,但如果你知道0 <= index < len(the_list)).

如果希望索引介于0和最后一个元素之间,则可以使用枚举:

names=['barney','fred','dino']

for i, name in enumerate(names):
    print(i + ' ' + name)
    if i in (3,4):
        # do your thing with the index 'i' or value 'name' for each item...
Run Code Online (Sandbox Code Playgroud)

如果你正在寻找一些定义的'索引'思想,我想你问的是错误的问题.也许您应该考虑使用映射容器(例如dict)与序列容器(例如列表).您可以像这样重写代码:

def do_something(name):
    print('some thing 1 done with ' + name)

def do_something_else(name):
    print('something 2 done with ' + name)        

def default(name):
    print('nothing done with ' + name)     

something_to_do={  
    3: do_something,        
    4: do_something_else
    }        

n = input ("Define number of actors: ")
count = 0
names = []

for count in range(n):
    print("Define name for actor {}:".format(count+1))
    name = raw_input ()
    names.append(name)

for name in names:
    try:
        something_to_do[len(name)](name)
    except KeyError:
        default(name)
Run Code Online (Sandbox Code Playgroud)

运行如下:

Define number of actors: 3
Define name for actor 1: bob
Define name for actor 2: tony
Define name for actor 3: alice
some thing 1 done with bob
something 2 done with tony
nothing done with alice
Run Code Online (Sandbox Code Playgroud)

你也可以使用.get方法而不是try/except用于更短的版本:

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice
Run Code Online (Sandbox Code Playgroud)

  • @LiorMagen:你是对的,我编辑了它.对于这样一个迂腐的错误,对于一个相当受欢迎的帖子投票,这有点苛刻.一个简单的评论就足够了. (9认同)
  • 试试块?我是Python的初学者,但这似乎是一个很大的编程中没有...流控制的例外?我们无法控制的事情应该是例外吗? (3认同)
  • @Luis我也是Python的初学者,但是我从这些实例中读到的异常处理是Python推广的C/Java/C#样式.请参阅http://stackoverflow.com/questions/11360858/what-is-the-eafp-principle-in-python (3认同)
  • 嗯,我让代表进行编辑,但这似乎很粗鲁。我会说“*注意*”,只要一个值*可以通过列表中的特定索引查找*,这种方法就会起作用。这与存在索引不太一样。例如,您可以获取 -1(最后一项)处的值,但该索引不存在。要检查索引是否存在,请使用 0 &lt;= n &lt; len(lst)` (3认同)

jfs*_*jfs 14

len(nams)应该n在你的代码中等于.所有索引都0 <= i < n"存在".


Kai*_*ais 9

只需使用以下代码即可完成:

if index < len(my_list):
    print(index, 'exists in the list')
else:
    print(index, "doesn't exist in the list")
Run Code Online (Sandbox Code Playgroud)


Kar*_*tel 7

我需要编码,如果某个列表索引存在,则运行一个函数。

您已经知道如何对此进行测试,并且实际上已经在您的代码中执行了此类测试

长度列表的有效索引n0通过n-1包含的。

因此,i 当且仅当列表的长度至少为 时,列表才有索引i + 1


Art*_*yer 5

使用列表的长度是检查索引是否存在的最快解决方案:

def index_exists(ls, i):
    return (0 <= i < len(ls)) or (-len(ls) <= i < 0)
Run Code Online (Sandbox Code Playgroud)

这还将测试负索引以及大多数具有长度的序列类型(如rangesstr)。

如果无论如何您以后都需要访问该索引处的项目,则宽恕要比权限容易,并且它也更快,更Python化。使用try: except:

try:
    item = ls[i]
    # Do something with item
except IndexError:
    # Do something without the item
Run Code Online (Sandbox Code Playgroud)

这将与以下内容相反:

if index_exists(ls, i):
    item = ls[i]
    # Do something with item
else:
    # Do something without the item
Run Code Online (Sandbox Code Playgroud)