หากดัชนีรายการมีอยู่ให้ทำ X


131

ในโปรแกรมของฉันผู้ใช้ป้อนหมายเลข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
ดูเหมือนว่าคุณต้องการพิมพ์ cast nเป็นจำนวนเต็มไม่ใช่รายการ ฉันสับสน
mVChr

2
ใช่ปัญหาที่แท้จริงที่นี่ใช้nแทนnamsในifs
Wooble

ในกรณีของคุณ n ไม่ใช่รายการ ขั้นแรกให้ตรวจสอบ (ร่าย) ให้เป็นจำนวนเต็มจากนั้นคุณสามารถทำซ้ำหรือระบุได้ขึ้นอยู่กับเอฟเฟกต์ที่คุณต้องการบรรลุ
Laidback

ใช่พิมพ์ผิด แก้ไขเป็นชื่อ []
user1569317

"ความจริงที่ว่าฉันมีคำสั่งย่อย if เกี่ยวกับ len (my_list)" คุณเคยคิดเกี่ยวกับสิ่งที่มีนัยเกี่ยวกับดัชนีรายการใดบ้างที่มีอยู่โดยข้อเท็จจริงที่ว่าlenรายการนั้นมีค่าอย่างน้อยที่สุดหรือไม่?
Karl Knechtel

คำตอบ:


159

จะมีประโยชน์มากกว่าสำหรับคุณที่จะใช้ความยาวของรายการlen(n)เพื่อแจ้งการตัดสินใจของคุณแทนที่จะตรวจสอบn[i]ความยาวที่เป็นไปได้แต่ละรายการ


6
อ๋อ เมื่อตรวจสอบโค้ดแล้วการตั้งค่าของฉันไม่จำเป็นอย่างยิ่ง len (n) สำเร็จทุกสิ่งที่ฉันต้องการ ขอบคุณสำหรับประเด็นในทิศทางที่ถูกต้อง
user1569317

1
สิ่งนี้ไม่ได้คำนึงถึงดัชนีเชิงลบ วิธีที่ดีที่สุดที่ฉันรู้คือลอง / ยกเว้น IndexError แต่มันเป็นการดีที่จะมีวิธีที่กระชับในการรับบูล
Abram

ในดัชนีเชิงลบของ Python ในรายการให้นับถอยหลังจากท้ายรายการ ดังนั้นจึงไม่สามารถอยู่ในลักษณะที่ส่งผลกระทบต่อความยาวของรายการ
JonathanV

84

ฉันต้องเขียนโค้ดเพื่อให้ถ้าดัชนีรายการมีอยู่ให้เรียกใช้ฟังก์ชัน

นี่คือการใช้งานที่สมบูรณ์แบบสำหรับการลองบล็อก :

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มีอยู่ (กล่าวคือไม่จำเป็นต้องลองยกเว้นถ้าคุณรู้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 แต่ดูเหมือนจะไม่ใช่เรื่องใหญ่ในการเขียนโปรแกรม ... ข้อยกเว้นสำหรับการควบคุมโฟลว์? ข้อยกเว้นควรมีไว้สำหรับสิ่งที่เราควบคุมไม่ได้ใช่ไหม
ลุย

3
@ Luis ฉันเป็นมือใหม่ใน Python เช่นกัน แต่จากสิ่งที่ฉันอ่านการจัดการข้อยกเว้นในอินสแตนซ์เหล่านี้คือรูปแบบที่ Python ส่งเสริมว่า C / Java / C # ไม่ทำ ดูstackoverflow.com/questions/11360858/…
Tinister

ประโยค 'ดัชนีทั้งหมดในรายการ Python ระหว่าง 0 ถึง len (list)' ผิดอย่างแน่นอน สมมติว่ามีรายการ x = [1, 2, 3] ซึ่ง len_x = 3 ไม่มีดัชนีดังกล่าวเป็น 3 ประโยคควรจะเป็น: 'ดัชนีทั้งหมดในรายการ Python ระหว่าง 0 ถึง len (รายการ) - 1' .
Lior Magen

9
@LiorMagen: คุณพูดถูกและฉันแก้ไขมัน นั่นเป็นเรื่องยากที่จะลงคะแนนโพสต์ที่เป็นที่นิยมพอสมควรสำหรับข้อผิดพลาดที่อวดอ้าง ความคิดเห็นง่ายๆก็เพียงพอแล้ว
dawg

ฉันจะชี้ให้เห็นว่าการติดสิ่งต่างๆภายใน 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

ขอบคุณสำหรับสิ่งนี้โดยเฉพาะประโยคสุดท้ายซึ่งเป็นคุณสมบัติสำคัญของรายการ Python ที่ทำให้แตกต่างจากอาร์เรย์ JavaScript และโครงสร้างอื่น ๆ ที่คล้ายคลึงกัน
robert

6

การใช้ความยาวของรายการจะเป็นวิธีที่เร็วที่สุดในการตรวจสอบว่ามีดัชนีอยู่หรือไม่:

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

นอกจากนี้ยังทดสอบดัชนีเชิงลบและประเภทลำดับส่วนใหญ่ (Like rangesและstrs) ที่มีความยาว

หากคุณต้องการเข้าถึงรายการที่ดัชนีนั้นในภายหลังการขอการให้อภัยจะง่ายกว่าการอนุญาตและยังเร็วกว่าและ 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)
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
thewaywewere

-3

คำตอบมากมายไม่ใช่คำตอบง่ายๆ

หากต้องการตรวจสอบว่ามีดัชนี 'id' อยู่ที่ dictionary dict:

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

if 'age' in dic

คืนค่าจริงหากมี "อายุ"


1
ไม่ใช่คำตอบที่ดีสำหรับคำถาม คำถามเกี่ยวกับรายการไม่ใช่พจนานุกรม สิ่งที่คุณเสนอไม่สามารถทำได้ในกรณีเช่นนี้: ["joao", 39]
Ruhrpottpatriot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.