172

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

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

由于我已经嵌套了关于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.
4

12 回答 12

194

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

于 2012-08-02T21:46:38.343 回答
108

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

这是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...

但是,根据定义,Python 列表中的所有项目都存在于0和之间len(the_list)-1(即,如果您知道,则不需要 try 块0 <= index < len(the_list))。

如果你想要 0 和最后一个元素之间的索引,你可以使用enumerate :

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...

但是,如果您正在寻找一些已定义的“索引”,我认为您问的是错误的问题。也许您应该考虑使用映射容器(例如 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)

像这样运行:

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

您也可以使用.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
于 2012-08-02T21:42:43.500 回答
21

len(nams)n在您的代码中应该等于。所有索引0 <= i < n“存在”。

于 2012-08-02T21:42:45.003 回答
19

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

if index < len(my_list):
    print(index, 'exists in the list')
else:
    print(index, "doesn't exist in the list")
于 2018-07-05T16:10:19.133 回答
8

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

def index_exists(ls, i):
    return (0 <= i < len(ls)) or (-len(ls) <= i < 0)

这也测试负索引,以及大多数具有长度的序列类型(Likeranges和s)。str

如果您之后无论如何都需要访问该索引处的项目,请求原谅比许可更容易,而且它也更快,更 Pythonic。使用try: except:.

try:
    item = ls[i]
    # Do something with item
except IndexError:
    # Do something without the item

这将与:

if index_exists(ls, i):
    item = ls[i]
    # Do something with item
else:
    # Do something without the item
于 2017-05-31T10:34:18.583 回答
7

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

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

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

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

于 2012-08-02T22:47:12.173 回答
3

如果要迭代插入的演员数据:

for i in range(n):
    if len(nams[i]) > 3:
        do_something
    if len(nams[i]) > 4:
        do_something_else
于 2012-08-02T21:45:36.380 回答
1

好的,所以我认为这实际上是可能的(为了争论):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False
于 2017-02-02T22:38:58.170 回答
1

你可以试试这样的

list = ["a", "b", "C", "d", "e", "f", "r"]

for i in range(0, len(list), 2):
    print list[i]
    if len(list) % 2 == 1 and  i == len(list)-1:
        break
    print list[i+1];
于 2018-01-03T18:16:16.093 回答
1

单线:

do_X() if len(your_list) > your_index else do_something_else()  

完整示例:

In [10]: def do_X(): 
    ...:     print(1) 
    ...:                                                                                                                                                                                                                                      

In [11]: def do_something_else(): 
    ...:     print(2) 
    ...:                                                                                                                                                                                                                                      

In [12]: your_index = 2                                                                                                                                                                                                                       

In [13]: your_list = [1,2,3]                                                                                                                                                                                                                  

In [14]: do_X() if len(your_list) > your_index else do_something_else()                                                                                                                                                                      
1

仅供参考。恕我直言,try ... except IndexError是更好的解决方案。

于 2020-03-02T13:13:37.587 回答
1

这是我今天想解决这个问题的一种简单但计算效率低的方法:

只需在 my_list 中创建一个可用索引列表:

indices = [index for index, _val in enumerate(my_list)]

然后您可以在每个代码块之前进行测试:

if 1 in indices:
    "do something"
if 2 in indices:
    "do something more"

但任何阅读本文的人都应该从以下位置获得正确答案:@user6039980

于 2021-07-03T17:04:23.977 回答
-4

不要在括号前面留出任何空间。

例子:

n = input ()
         ^

提示:您应该在代码上方和/或下方添加注释。不在您的代码后面。


祝你今天过得愉快。

于 2017-05-07T11:20:16.713 回答