목록 색인이 존재하면 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

2
그렇습니다. 여기서 진짜 문제 는 s n대신에 사용하는 것입니다namsif
— Wooble

귀하의 경우 n은 목록이 아닙니다. 먼저 정수인지 확인 (캐스트) 한 다음 달성하려는 효과에 따라 반복하거나 열거 할 수 있습니다.
— 여유로운 시간

네, 잘못 입력했습니다. nams로 고정 []
— user1569317

"len (my_list)에 대한 하위 if 문이 있다는 사실." 목록 len의 목록이 적어도 특정 값 이라는 사실에 의해 어떤 목록 색인이 존재하는지 암시하는 것에 대해 생각해 보셨습니까 ?
— Karl Knechtel

답변:


157

가능한 각 길이를 len(n)확인 n[i]하는 대신 목록의 길이를 사용 하여 결정에 알리는 것이 더 유용 할 수 있습니까?


6
네. 코드를 검토하자마자 내 설정은 완전히 불필요한 것이었다. len (n)은 내가 필요한 모든 것을 성취했습니다. 올바른 방향으로 포인트를 주셔서 감사합니다.
— user1569317

1
음수 인덱스는 설명하지 않습니다. 내가 아는 가장 좋은 방법은 IndexError를 제외하고 시도하는 것이지만 bool을 얻는 간결한 방법을 갖는 것이 좋을 것입니다
— Abram

파이썬에서리스트의 네거티브 인덱스는리스트의 끝에서부터 거꾸로 계산됩니다. 따라서 목록의 길이에 영향을주는 방식으로는 존재할 수 없었습니다.
— 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...

그러나 정의에 따라 파이썬의 모든 항목은 사이 0에 len(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

더 짧은 버전은 try / except 대신 .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
블록을 시도? 나는 파이썬의 초보자이지만 프로그래밍에서 큰 아니오처럼 보입니다 ... 유량 제어에 대한 예외? 우리가 제대로 통제 할 수없는 것은 예외입니까?
— Luis

3
@Luis 저는 Python의 초보자이기도하지만 이러한 인스턴스에서 예외 처리를 읽은 것은 Python이 C / Java / C # 이하 지 않는 스타일을 홍보합니다. 참조 stackoverflow.com/questions/11360858/...
— Tinister

'0과 len (list) 사이의 파이썬 목록의 모든 인덱스'라는 문장은 절대적으로 잘못되었습니다. x = [1, 2, 3] len_x = 3이라는 목록이 있다고 가정 해 봅시다. 3과 같은 색인은 없습니다. .
— Lior Magen

9
@LiorMagen : 당신이 옳고 편집했습니다. 그런 pedantic 오류에 대해 상당히 인기있는 게시물을 다운 투표하는 것은 다소 힘든 일입니다. 간단한 의견이면 충분합니다.
— dawg

나는 내부의 일을 고집하는 것을 지적거야 try않습니다 하지 테이크 - 인덱스가 fetchable가 그냥 경우 존재하는 경우를 알려 -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

이것, 특히 마지막 문장에 감사드립니다.이 문장은 JavaScript 배열 및 기타 유사한 구문과 다른 파이썬 목록의 중요한 속성입니다.
— robert

6

목록의 길이를 사용하는 것이 인덱스가 있는지 확인하는 가장 빠른 솔루션입니다.

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

또한 음수 인덱스와 길이가있는 대부분의 시퀀스 유형 (Like ranges및 strs) 도 테스트합니다 .

어쨌든 나중에 해당 색인의 항목에 액세스 해야하는 경우 permission보다 용서를 구하는 것이 더 쉽고 , 더 빠르고 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

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)
— 이것은

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 지침을 따르기 위해이 방법에 대한 답변을 읽으 십시오.
— thewaywe는

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