リストインデックスが存在する場合、Xを実行


128

私のプログラムでは、ユーザーがnumber 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.

1
キャストnをリストではなく整数として入力したいようです。よくわかりません。
mVChr 2012

2
はい、ここでの本当の問題はsのn代わりに使用していますnamsif
Wooble

あなたの場合、nはリストではありません。最初に整数であることを確認(キャスト)してから、達成したい効果に応じて反復または列挙できます。
リラックスした

うん、タイプミス。nams []に修正
user1569317

「len(my_list)に関するサブifステートメントがあるという事実。」lenリストのが少なくとも特定の値であるという事実によって、どのリストインデックスが存在するかについて何を暗示するかについて考えましたか?
Karl Knechtel、2012

回答:


157

考えられる長さごとにlen(n)チェックするのn[i]ではなく、リストの長さを使用して決定を通知する方が便利でしょうか?


6
うん。コードを確認すると、私の設定は完全に不要でした。len(n)は私が必要とするすべてを達成しました。正しい方向に向けてポイントをありがとう。
user1569317 2012

1
これは負のインデックスを考慮していません。私が知っている最良の方法は、tryErrorを除いて、try / exceptですが、ブール値を取得する簡潔な方法があるとよいでしょう
Abram

Pythonでは、リストの負のインデックスはリストの最後から逆に数えるだけです。したがって、リストの長さに影響を与えるような方法で存在することはできません。
JonathanV

84

特定のリストインデックスが存在する場合に関数を実行するようにコーディングする必要があります。

これは、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リスト内のすべてのアイテムは、その間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...

定義された「インデックス」の考えを探しているなら、あなたは間違った質問をしていると思います。おそらく、マッピングコンテナー(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メソッドを使用することもできます。

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice

3
ブロックしてみる?私はPythonの初心者ですが、これはプログラミングでは大したことではないようです...フロー制御の例外?例外は、私たちが正しく制御できないもののためであるべきですか?
Luis

3
@Luis私もPythonの初心者ですが、これらのインスタンスでの例外処理について読んだことから、PythonがC / Java / C#が推奨していないスタイルです。stackoverflow.com/questions/11360858/…を
Tinister

「0からlen(list)までのPythonリストのすべてのインデックス」という文は完全に間違っています。リストx = [1、2、3]があり、len_x = 3であるとしましょう。3のようなインデックスはありません。 。
Lior Magen

9
@LiorMagen:あなたは正しいと私はそれを編集しました。それは、そのような悲惨なエラーのためにかなり人気のある投稿に反対票を投じるのはちょっと厳しいです。簡単なコメントで十分です。
dawg 2016

フェッチ可能な場合でも、インデックスが存在するかどうかをa内に固定tryして通知されないことを指摘しておきます。-1そのインデックスは実際には存在しませんが、値が返されます。
George Mauer

17

len(nams)nあなたのコードと等しくなければなりません。すべてのインデックスは0 <= i < n「存在」します。


15

次のコードを使用して簡単に実行できます。

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

6

特定のリストインデックスが存在する場合に関数を実行するようにコーディングする必要があります。

あなたはすでにこれをテストする方法を知っており、実際にはあなたのコードでそのようなテストをすでに実行しています

長さのリストのための有効なインデックスがnある0を通じてn-1包括的。

したがって、リストの長さが少なくともであるi 場合にのみ、リストにインデックスがありますi + 1


はい、問題を解決するツールがありましたが、明確に適用していませんでした。正しい方向に向けてポイントをありがとう。
user1569317 2012

これ、特に最後の文に感謝します。これは、JavaScript配列や他の類似の構造とは異なるPythonリストの重要なプロパティです。
ロバート

6

リストの長さを使用することが、インデックスが存在するかどうかを確認する最も速い解決策です。

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

これは、負のインデックス、および長さを持つほとんどのシーケンスタイプ(Like rangesstrs)もテストします。

とにかく後でそのインデックスにあるアイテムにアクセスする必要がある場合は、許可よりも許しを求める方簡単です。また、高速でPython的です。を使用し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

3

挿入されたアクターデータを反復処理する場合:

for i in range(n):
    if len(nams[i]) > 3:
        do_something
    if len(nams[i]) > 4:
        do_something_else

1

わかりました、それで私はそれが実際に可能であると思います(議論のために):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False

:これはさらに簡単になりますけれども3 in range(len(your_list)
avloss

1
あるいはこの3 in xrange(len(your_list)-おそらく、より良いこれ以上行うことはできません
avloss

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];

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

参考までに。Imho、try ... except IndexErrorより良いソリューションです。


-3

ブラケットの前にスペースを置かないでください。

例:

n = input ()
         ^

ヒント:コードの上または下にコメントを追加する必要があります。コードの背後ではありません。


ごきげんよう。


SOへようこそ!返信は、回答ではなくコメントのように見えます。十分な評判られると、どの投稿にもコメントできるようになります。また、代わりに何ができるかを確認してください。回答するつもりなら、このハウツーの回答を読んでSOガイドラインに従ってください。
2017年

-3

単純な答えではなく、多くの答え。

辞書dictにインデックス 'id'が存在するかどうかを確認するには:

dic = {}
dic['name'] = "joao"
dic['age']  = "39"

if 'age' in dic

「年齢」が存在する場合はtrueを返します。


1
質問に対する良い答えではありません。問題は、辞書ではなくリストについてでした。次のような場合、提案したことは実行できません:["joao"、39]
Ruhrpottpatriot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.