ในความเข้าใจรายการ Python สามารถเข้าถึงดัชนีรายการได้หรือไม่


94

พิจารณารหัส Python ต่อไปนี้ซึ่งฉันเพิ่มในรายการใหม่list2ทั้งหมดที่มีดัชนีตั้งแต่ 1 ถึง 3 ของlist1:

for ind, obj in enumerate(list1):
    if 4 > ind > 0:
        list2.append(obj)

คุณจะเขียนสิ่งนี้โดยใช้ความเข้าใจรายการได้อย่างไรถ้าฉันไม่สามารถเข้าถึงดัชนีผ่านการแจงนับได้

สิ่งที่ต้องการ:

list2 = [x for x in list1 if 4 > ind > 0]

แต่เนื่องจากฉันไม่มีindเบอร์นี่จะใช้ได้ไหม

list2 = [x for x in enumerate(list1) if 4 > ind > 0]

3
ฉันเดาว่ากรณีการใช้งานจริงของคุณซับซ้อนกว่า แต่คุณสามารถแบ่งส่วนได้list1[1:4]ที่นี่
wim

คุณหมายถึงว่าฉันสามารถแบ่งรายชื่อในความเข้าใจรายการได้หรือไม่? ชอบ: [x for x in list1[1:4]]?
Pav Ametvic

@PavAmetvic ไม่มี @wim หมายความว่าคุณสามารถเขียนได้list2 = list1[1:4]
John La Rooy

คำตอบ:




12

เว้นแต่กรณีการใช้งานจริงของคุณจะซับซ้อนกว่านี้คุณควรใช้ชิ้นส่วนรายการตามที่ @wim แนะนำ

>>> list1 = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> [x for ind, x in enumerate(list1) if 4 > ind > 0]
['one', 'two', 'three']
>>> list1[1:4]
['one', 'two', 'three']

สำหรับกรณีที่ซับซ้อนมากขึ้น - หากคุณไม่ต้องการดัชนีจริง ๆ - การทำซ้ำบนสไลซ์หรือไอสไลซ์

list2 = [x*2 for x in list1[1:4]]

หรือ

from itertools import islice
list2 = [x*2 for x in islice(list1, 1, 4)]

สำหรับชิ้นเล็ก ๆ list1[1:4]ที่เรียบง่าย หากชิ้นส่วนมีขนาดค่อนข้างใหญ่ควรใช้ islice เพื่อหลีกเลี่ยงการคัดลอกหน่วยความจำ


ขอบคุณ แต่เนื่องจากฉันต้องการดำเนินการกับ 'x' ในความเข้าใจ (สมมติว่า x * x) ก่อนที่ฉันจะเก็บไว้ในรายการใหม่ดูเหมือนว่าการใช้ชิ้นส่วนในการทำความเข้าใจรายการเป็นวิธีที่ดีที่สุด! ขอบคุณ
Pav Ametvic

@PavAmetvic โอเคกรณีเหล่านั้นยังง่ายพอที่จะไม่ต้องมีการแจงนับ
John La Rooy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.