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

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

더 짧은 버전은 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 rangesstrs) 도 테스트합니다 .

어쨌든 나중에 해당 색인의 항목에 액세스 해야하는 경우 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.