ใน Python คุณจะได้องค์ประกอบสุดท้ายของรายการได้อย่างไร
ใน Python คุณจะได้องค์ประกอบสุดท้ายของรายการได้อย่างไร
คำตอบ:
some_list[-1]
เป็น Pythonic ที่สั้นที่สุดและมากที่สุด
ที่จริงแล้วคุณสามารถทำอะไรได้มากกว่านี้กับไวยากรณ์นี้ some_list[-n]
ไวยากรณ์ได้ element ที่ n ไปสุดท้าย ดังนั้นsome_list[-1]
ได้รับองค์ประกอบที่ผ่านมาsome_list[-2]
ได้รับสองสุดท้าย ฯลฯ ทุกทางลงไปsome_list[-len(some_list)]
ซึ่งจะช่วยให้คุณองค์ประกอบแรก
คุณยังสามารถตั้งค่าองค์ประกอบรายการได้ด้วยวิธีนี้ ตัวอย่างเช่น
>>> some_list = [1, 2, 3]
>>> some_list[-1] = 5 # Set the last element
>>> some_list[-2] = 3 # Set the second to last element
>>> some_list
[1, 3, 5]
โปรดทราบว่าการรับไอเท็มตามดัชนีจะเพิ่มIndexError
หากไม่มีรายการที่คาดหวัง ซึ่งหมายความว่าsome_list[-1]
จะเพิ่มข้อยกเว้นหากsome_list
ว่างเปล่าเนื่องจากรายการว่างไม่สามารถมีองค์ประกอบสุดท้ายได้
หากวัตถุstr()
หรือlist()
วัตถุของคุณอาจว่างเปล่าดังนั้น: astr = ''
หรือalist = []
คุณอาจต้องการใช้alist[-1:]
แทนalist[-1]
วัตถุ "sameness"
ความสำคัญของสิ่งนี้คือ:
alist = []
alist[-1] # will generate an IndexError exception whereas
alist[-1:] # will return an empty list
astr = ''
astr[-1] # will generate an IndexError exception whereas
astr[-1:] # will return an empty str
ในกรณีที่มีการแยกความแตกต่างคือการส่งคืนวัตถุที่ว่างเปล่าหรือวัตถุที่ว่างเปล่าคือ "องค์ประกอบสุดท้าย" - เหมือนเป็นวัตถุยกเว้น
if len(my_vector) == 0 or my_vector[-1] != update_val
เป็นรูปแบบที่ใช้การได้ แต่แน่นอนว่าไม่ใช่วิธีแก้ปัญหาระดับโลก - มันจะดีถ้ามีรูปแบบไวยากรณ์ที่ไม่มีผลลัพธ์
xs[-1] if xs else None
คุณยังสามารถทำสิ่งต่อไปนี้
alist.pop()
ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำกับรายการของคุณเพราะpop()
วิธีการจะลบองค์ประกอบสุดท้าย
วิธีที่ง่ายที่สุดในการแสดงองค์ประกอบสุดท้ายในหลามคือ
>>> list[-1:] # returns indexed value
[3]
>>> list[-1] # returns value
3
มีวิธีการอื่น ๆ อีกมากมายเพื่อให้บรรลุเป้าหมายดังกล่าว แต่วิธีนี้สั้นและน่าใช้
list[-1]
จะเกิดข้อผิดพลาด
a[-1:][0]
ที่ทุกคน ? เขาให้a[-1]
อะไรต่อไปด้วย กรุณาอธิบาย
ใน Python คุณจะได้องค์ประกอบสุดท้ายของรายการได้อย่างไร
เพื่อให้ได้องค์ประกอบสุดท้าย
ส่ง-1
ไปยังสัญกรณ์ห้อย:
>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'
ดัชนีและชิ้นสามารถใช้จำนวนเต็มลบเป็นอาร์กิวเมนต์
ฉันได้แก้ไขตัวอย่างจากเอกสารเพื่อระบุรายการในลำดับแต่ละอ้างอิงดัชนีในกรณีนี้ในสตริง"Python"
, -1
อ้างอิงองค์ประกอบสุดท้าย, ตัวอักษร'n'
:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5
-6 -5 -4 -3 -2 -1
>>> p = 'Python'
>>> p[-1]
'n'
วิธีนี้อาจทำให้รายการที่สองเป็นจริงโดยไม่จำเป็นเพื่อวัตถุประสงค์ในการรับองค์ประกอบสุดท้าย แต่เพื่อประโยชน์ในความสมบูรณ์ (และเนื่องจากมันรองรับการทำซ้ำใด ๆ
>>> *head, last = a_list
>>> last
'three'
ชื่อตัวแปรส่วนหัวถูกผูกไว้กับรายการที่สร้างขึ้นใหม่โดยไม่จำเป็น:
>>> head
['zero', 'one', 'two']
หากคุณตั้งใจจะไม่ทำอะไรกับรายการนี้จะเป็นเรื่องเพิ่มเติม:
*_, last = a_list
หรือจริงๆถ้าคุณรู้ว่ามันเป็นรายการ (หรืออย่างน้อยก็ยอมรับสัญกรณ์ห้อย):
last = a_list[-1]
ผู้วิจารณ์พูดว่า:
ฉันหวังว่าหลามจะมีฟังก์ชั่นสำหรับแรก () และสุดท้าย () เหมือน Lisp ทำ ... มันจะกำจัดฟังก์ชั่นแลมบ์ดาที่ไม่จำเป็นออกไปมากมาย
เหล่านี้จะค่อนข้างง่ายในการกำหนด:
def last(a_list):
return a_list[-1]
def first(a_list):
return a_list[0]
หรือใช้operator.itemgetter
:
>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)
ในกรณีใดกรณีหนึ่ง:
>>> last(a_list)
'three'
>>> first(a_list)
'zero'
หากคุณกำลังทำอะไรที่ซับซ้อนกว่านี้คุณอาจพบว่ามันมีประสิทธิภาพมากกว่าเพื่อให้ได้องค์ประกอบสุดท้ายด้วยวิธีที่ต่างกันเล็กน้อย
หากคุณยังไม่คุ้นเคยกับการเขียนโปรแกรมคุณควรหลีกเลี่ยงส่วนนี้ หากคุณเปลี่ยนอัลกอริทึมของคุณในที่เดียวมันอาจส่งผลกระทบต่อโค้ดอื่นโดยไม่ตั้งใจ
ฉันพยายามให้คำเตือนและเงื่อนไขอย่างครบถ้วนเท่าที่จะทำได้ แต่ฉันอาจพลาดอะไรบางอย่าง กรุณาแสดงความคิดเห็นหากคุณคิดว่าฉันออกจากถ้ำ
ชิ้นส่วนของรายการส่งคืนรายการใหม่ - เพื่อให้เราสามารถแบ่งจาก -1 ถึงท้ายถ้าเราต้องการองค์ประกอบในรายการใหม่:
>>> a_slice = a_list[-1:]
>>> a_slice
['three']
นี่เป็นส่วนของการไม่ล้มเหลวหากรายการว่างเปล่า:
>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
... do_something(tail)
ในขณะที่ความพยายามในการเข้าถึงโดยดัชนีจะเพิ่มสิ่งIndexError
ที่ต้องจัดการ:
>>> empty_list[-1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
แต่อีกครั้งการหั่นเพื่อจุดประสงค์นี้ควรจะทำก็ต่อเมื่อคุณต้องการ:
for
ลูปในฐานะที่เป็นคุณสมบัติของ Python ไม่มีการกำหนดขอบเขตภายในในการfor
วนซ้ำ
หากคุณดำเนินการซ้ำอย่างสมบูรณ์ในรายการแล้วองค์ประกอบสุดท้ายจะยังคงถูกอ้างอิงโดยชื่อตัวแปรที่กำหนดในลูป:
>>> def do_something(arg): pass
>>> for item in a_list:
... do_something(item)
...
>>> item
'three'
นี่ไม่ใช่ความหมายสุดท้ายในรายการ นี่คือความหมายสุดท้ายของชื่อที่item
ถูกผูกไว้
>>> def do_something(arg): raise Exception
>>> for item in a_list:
... do_something(item)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 1, in do_something
Exception
>>> item
'zero'
ดังนั้นสิ่งนี้ควรใช้เพื่อรับองค์ประกอบสุดท้ายหากคุณ
นอกจากนี้เรายังสามารถกลายพันธุ์รายการเดิมของเราโดยการลบและกลับองค์ประกอบสุดท้าย:
>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']
แต่ตอนนี้มีการแก้ไขรายการเดิม
( -1
จริงๆแล้วเป็นอาร์กิวเมนต์เริ่มต้นดังนั้นlist.pop
สามารถนำมาใช้โดยไม่มีอาร์กิวเมนต์ดัชนี):
>>> a_list.pop()
'two'
ทำเช่นนี้หาก
กรณีเหล่านี้เป็นกรณีการใช้งานที่ถูกต้อง แต่ไม่บ่อยนัก
ฉันไม่รู้ว่าทำไมคุณถึงทำ แต่เพื่อความสมบูรณ์เนื่องจากreversed
ส่งคืนตัววนซ้ำ (ซึ่งรองรับโปรโตคอลตัววนซ้ำ) คุณสามารถส่งผลลัพธ์ไปที่next
:
>>> next(reversed([1,2,3]))
3
ดังนั้นจึงเหมือนกับการย้อนกลับของสิ่งนี้:
>>> next(iter([1,2,3]))
1
แต่ฉันไม่สามารถคิดได้ว่ามีเหตุผลที่ดีที่จะทำสิ่งนี้เว้นแต่ว่าคุณจะต้องมีตัววนซ้ำย้อนกลับที่เหลือในภายหลังซึ่งอาจมีลักษณะเช่นนี้:
reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)
use_later = list(reverse_iterator)
และตอนนี้:
>>> use_later
[2, 1]
>>> last_element
3
เพื่อป้องกันIndexError: list index out of range
ใช้ไวยากรณ์นี้:
mylist = [1, 2, 3, 4]
# With None as default value:
value = mylist and mylist[-1]
# With specified default value (option 1):
value = mylist and mylist[-1] or 'default'
# With specified default value (option 2):
value = mylist[-1] if mylist else 'default'
วิธีอื่น:
some_list.reverse()
some_list[0]
lst[-1]
เป็นวิธีที่ดีที่สุด แต่ด้วยความสามารถทั่วไปที่พิจารณาได้more_itertools.last
:
รหัส
import more_itertools as mit
mit.last([0, 1, 2, 3])
# 3
mit.last(iter([1, 2, 3]))
# 3
mit.last([], "some default")
# 'some default'
list[-1]
จะดึงองค์ประกอบสุดท้ายของรายการโดยไม่เปลี่ยนรายการ
list.pop()
จะดึงองค์ประกอบสุดท้ายของรายการ แต่มันจะกลายพันธุ์ / เปลี่ยนรายการเดิม โดยปกติแล้วไม่แนะนำให้ทำการผ่าเหล่ารายการดั้งเดิม
อีกวิธีหนึ่งถ้าด้วยเหตุผลบางอย่างคุณกำลังมองหาบางสิ่งบางอย่างที่ไพเราะน้อยกว่าคุณสามารถใช้list[len(list)-1]
โดยสมมติว่ารายการไม่ว่างเปล่า
นอกจากนี้คุณยังสามารถใช้รหัสด้านล่างหากคุณไม่ต้องการรับ IndexError เมื่อรายการว่างเปล่า
next(reversed(some_list), None)
โอเค แต่เรื่องทั่วไปในเกือบทุกภาษาitems[len(items) - 1]
คืออะไร? นี่คือ IMO วิธีที่ง่ายที่สุดในการรับองค์ประกอบสุดท้ายเนื่องจากไม่ต้องการความรู้แบบpythonic
some_list[-1]
วิธีการเพราะมันมีเหตุผลมากกว่าและแสดงให้เห็นว่ามันทำงานได้ดีกว่าsome_list[-1]
ในความคิดของฉัน
some_list.last
- มันจะเป็นรหัสที่สวยงาม