เริ่มต้นดัชนีสำหรับการทำซ้ำรายการ Python


90

วิธีใดเป็นวิธีที่ดีที่สุดในการตั้งค่าดัชนีเริ่มต้นเมื่อทำซ้ำรายการใน Python ตัวอย่างเช่นฉันมีรายการวันในสัปดาห์ - วันอาทิตย์วันจันทร์วันอังคาร ... วันเสาร์ - แต่ฉันต้องการทบทวนรายการโดยเริ่มตั้งแต่วันจันทร์ แนวทางปฏิบัติที่ดีที่สุดในการดำเนินการนี้คืออะไร?


1
คุณต้องการวนซ้ำจนถึงวันเสาร์หรือคุณต้องการให้มันวนรอบและพิมพ์วันอาทิตย์ที่ผ่านมา?
juanchopanza

ฉันแค่อยากวนไปจนถึงวันเสาร์ จนถึงตอนนี้ฉันไม่ทราบว่าคุณสามารถใช้การแบ่งส่วนในรายการ Python ได้
Vincent Catalano

มีวิธีแก้ปัญหาที่เกี่ยวข้องกับเครื่องกำเนิดไฟฟ้า / iterables ด้วยและไม่ใช่เฉพาะรายการ หรือรายการใหญ่จริงๆ?
Charlie Parker

คำตอบ:


177

คุณสามารถใช้การหั่น :

for item in some_list[2:]:
    # do stuff

สิ่งนี้จะเริ่มต้นที่องค์ประกอบที่สามและวนซ้ำจนจบ


2
นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
Vincent Catalano

30
สิ่งนี้ไม่มีประสิทธิภาพสำหรับรายการขนาดใหญ่หรือไม่? ฉันเชื่อว่าการทำงานของชิ้นส่วนนี้ต้องคัดลอกองค์ประกอบรายการที่ถูกอ้างอิงไปยังรายการใหม่
UndeadKernel

4
ใช่สิ่งนี้ไม่มีประสิทธิภาพสำหรับรายการขนาดใหญ่ ดูคำตอบ gnibblers ด้านล่างสำหรับวิธีแก้ปัญหาที่ไม่ได้คัดลอก
Björn Pollex

คุณจะทำสิ่งนี้ได้อย่างไรหากคุณกำลังวนซ้ำโดยใช้เครื่องกำเนิดไฟฟ้า / iterables
Charlie Parker

2
คุณควรใช้isliceตามที่แนะนำในคำตอบของ John La Rooy
Björn Pollex


13

คุณสามารถวนซ้ำได้ตลอดเวลาโดยใช้ตัวนับดัชนีการวนซ้ำสไตล์ C ทั่วไป:

for i in range(len(l)-1):
    print l[i+1]

การทำตามสไตล์ "วนซ้ำในทุกองค์ประกอบ" จะดีกว่าเสมอเพราะนั่นเป็นเรื่องปกติที่ต้องทำ แต่ถ้ามันเข้ามาขวางทางคุณเพียงจำไว้ว่ารูปแบบทั่วไปนั้นรองรับเสมอ



4

หากสิ่งที่คุณต้องการคือการพิมพ์จากMondayเป็นต้นไปคุณสามารถใช้list's indexวิธีการที่จะหาตำแหน่งที่ 'จันทร์' อยู่ในรายการและสำทับจากที่นั่นที่อธิบายไว้ในบทความอื่น ๆ การใช้list.indexช่วยประหยัดการเข้ารหัสดัชนีสำหรับ "Monday" ซึ่งอาจเป็นสาเหตุของข้อผิดพลาด:

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d

ทางออกที่ดีจริงๆ!
aderchox

3

นี่คือเครื่องกำเนิดการหมุนซึ่งไม่จำเป็นต้องสร้างสำเนาของลำดับการป้อนข้อมูลที่บิดเบี้ยว ... อาจมีประโยชน์หากลำดับการป้อนข้อมูลมีขนาดใหญ่กว่า 7 รายการ

>>> def rotated_sequence(seq, start_index):
...     n = len(seq)
...     for i in xrange(n):
...         yield seq[(i + start_index) % n]
...
>>> s = 'su m tu w th f sa'.split()
>>> list(rotated_sequence(s, s.index('m')))
['m', 'tu', 'w', 'th', 'f', 'sa', 'su']
>>>

ใช่ - และง่ายต่อการขยายเพื่อสร้างลำดับการเกิดซ้ำที่ไม่สิ้นสุด
slothrop

อดไม่ได้ที่จะขอบคุณ @JohnMachin: งานที่ยอดเยี่ยมสำหรับคนที่ตายไป 264 ปี
jjon

1

เหตุใดผู้คนจึงใช้การแบ่งส่วนรายการ (ช้าเพราะคัดลอกไปยังรายการใหม่) การนำเข้าฟังก์ชันไลบรารีหรือพยายามหมุนอาร์เรย์สำหรับสิ่งนี้

ใช้ for-loop ปกติกับrange(start, stop, step)(โดยที่startและstepเป็นอาร์กิวเมนต์ที่เป็นทางเลือก)

ตัวอย่างเช่นการวนลูปผ่านอาร์เรย์เริ่มต้นที่ดัชนี 1:

for i in range(1, len(arr)):
    print(arr[i])

0

หากคุณต้องการ "ปิดรอบ" และหมุนรายการอย่างมีประสิทธิภาพเพื่อเริ่มต้นด้วยวันจันทร์ (แทนที่จะตัดรายการก่อนวันจันทร์):

dayNames = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
            'Friday', 'Saturday',  ]

startDayName = 'Monday'

startIndex = dayNames.index( startDayName )
print ( startIndex )

rotatedDayNames = dayNames[ startIndex: ] + dayNames [ :startIndex ]

for x in rotatedDayNames:
    print ( x )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.