내 프로그램에서 사용자는 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.
답변
가능한 각 길이를 len(n)
확인 n[i]
하는 대신 목록의 길이를 사용 하여 결정에 알리는 것이 더 유용 할 수 있습니까?
답변
특정 목록 색인이 존재하면 함수를 실행하도록 코딩해야합니다.
이것은 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
답변
len(nams)
n
코드와 같아야합니다 . 모든 인덱스 0 <= i < n
가 존재합니다.
답변
다음 코드를 사용하여 간단하게 수행 할 수 있습니다.
if index < len(my_list):
print(index, 'exists in the list')
else:
print(index, "doesn't exist in the list")
답변
특정 목록 색인이 존재하면 함수를 실행하도록 코딩해야합니다.
이미 이것을 테스트하는 방법을 알고 있으며 실제로 코드에서 이미 그러한 테스트를 수행하고 있습니다. .
길이의리스트에 대한 유효한 지표 n
이다 0
내지n-1
포함.
따라서 목록 의 길이가 적어도 i
경우에만 목록에 색인 이i + 1
있습니다.
답변
목록의 길이를 사용하는 것이 인덱스가 있는지 확인하는 가장 빠른 솔루션입니다.
def index_exists(ls, i):
return (0 <= i < len(ls)) or (-len(ls) <= i < 0)
또한 음수 인덱스와 길이가있는 대부분의 시퀀스 유형 (Like ranges
및 str
s) 도 테스트합니다 .
어쨌든 나중에 해당 색인의 항목에 액세스 해야하는 경우 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
답변
삽입 된 액터 데이터를 반복하려면 :
for i in range(n):
if len(nams[i]) > 3:
do_something
if len(nams[i]) > 4:
do_something_else