วิธีการวนซ้ำทั้งหมด แต่รายการสุดท้ายของรายการ?


160

ฉันต้องการวนรอบรายการที่ตรวจสอบแต่ละรายการกับรายการที่ติดตาม

มีวิธีที่ฉันสามารถวนซ้ำได้ทั้งหมด แต่รายการสุดท้ายใช้สำหรับ x ใน y หรือไม่ ฉันต้องการที่จะทำโดยไม่ต้องใช้ดัชนีถ้าฉันสามารถ

บันทึก

freespace ตอบคำถามจริงของฉันซึ่งเป็นสาเหตุที่ฉันตอบรับ แต่ SilentGhost ตอบคำถามที่ฉันควรถาม

ขออภัยในความสับสน

คำตอบ:


316
for x in y[:-1]

หากyเป็นตัวกำเนิดไฟฟ้าแล้วสิ่งด้านบนจะไม่ทำงาน


นั่นตอบคำถามของฉันขอบคุณ แต่ฉันลืมถามว่าฉันจะได้รับรายการหลังจาก x เป็นไปได้ไหม
David Sykes

3
- 1 ฉันไม่คิดว่าจะตอบคำถาม มันไม่ได้เปรียบเทียบแต่ละรายการกับรายการถัดไป - odwl 0 วินาทีที่ผ่านมา
odwl

4
ฉันคิดว่าฉันทำ ผู้เขียนกล่าวว่าเขาต้องการที่จะทำ X แล้วถามว่าเขาสามารถทำวายผมตอบว่าเขาสามารถทำวายว่าเขายอมรับคำตอบของฉันจะแสดงให้ฉันตอบคำถามที่เขาถามว่าถ้าไม่ได้เป็นคำถามที่เขาจริงๆอยากจะถาม Asker ยินดีที่จะลดระดับคำตอบนี้
FreeSpace

7
เพียงเพราะ OP ควรถามคำถามอื่นในครั้งแรกไม่ได้หมายความว่าคำถามของเขาและคำตอบนี้ไม่เป็นประโยชน์กับผู้อื่น +1
ศ. Falken

1
คุณพูดถึงว่าสิ่งนี้ไม่ได้ผลสำหรับเครื่องกำเนิดไฟฟ้า อะไรคือทางเลือกของyเครื่องกำเนิดไฟฟ้า?
Joost

50

วิธีที่ง่ายที่สุดในการเปรียบเทียบลำดับรายการกับรายการต่อไปนี้:

for i, j in zip(a, a[1:]):
     # compare i (the current) to j (the following)

15
นี่ตอบคำถามที่ฉันต้องการฉันถาม ขอบคุณ
David Sykes

3
ที่จริงคุณสามารถตัดส่วนแรกออกได้เนื่องจาก zip ตัดทอนรายการที่ยาวขึ้นไปเป็นความยาวที่สั้นกว่า สิ่งนี้จะช่วยให้คุณสร้างรายการได้หนึ่งรายการ (ในกรณีที่คุณกำลังเผชิญกับรายการขนาดใหญ่ แต่ในกรณีนี้คุณควรปฏิบัติตามแนวทางของ Ants Aasma ซึ่งไม่ได้คัดลอกอะไรเลย)
274

19

หากคุณต้องการที่จะได้รับองค์ประกอบทั้งหมดในการจับคู่ลำดับฉลาดใช้วิธีนี้ (ฟังก์ชั่นจับคู่มาจากตัวอย่างในโมดูล itertools)

from itertools import tee, izip, chain

def pairwise(seq):
    a,b = tee(seq)
    b.next()
    return izip(a,b)

for current_item, next_item in pairwise(y):
    if compare(current_item, next_item):
        # do what you have to do

หากคุณต้องการเปรียบเทียบค่าสุดท้ายกับค่าพิเศษบางอย่างเชนค่านั้นไปยังจุดสิ้นสุด

for current, next_item in pairwise(chain(y, [None])):

โปรดทราบว่าการใช้งานถัดไปสำหรับชื่อเงาในตัวตัวแปร
SilentGhost

1
ฉันไม่สนใจเงาตัวบิวด์อินที่ใช้น้อยกว่าเมื่อขอบเขตของตัวแปรเล็กและชื่อดีสำหรับการอ่าน อย่างไรก็ตามแก้ไขชื่อตัวแปรเพื่อรักษาวิธีการเข้ารหัสที่ดี
มด Aasma

5

หากคุณหมายถึงการเปรียบเทียบรายการที่ n กับรายการที่ +1 ในรายการที่คุณสามารถทำได้

>>> for i in range(len(list[:-1])):
...     print list[i]>list[i+1]

ทราบว่าไม่มีการเข้ารหัสที่ยากเกิดขึ้นที่นั่น มันควรจะโอเคถ้าคุณไม่รู้สึกเช่นนั้น


3
คุณสามารถแทนที่ len (รายการ [: - 1]) ด้วย len (รายการ) - 1 เพื่อหลีกเลี่ยงการคัดลอกรายการ และหลีกเลี่ยงการใช้ตัวแปรที่เรียกว่ารายการ ...
Remy Blank

2

หากต้องการเปรียบเทียบแต่ละรายการกับรายการถัดไปในตัววนซ้ำโดยไม่ต้องสร้างรายการให้ยกตัวอย่าง:

import itertools
it = (x for x in range(10))
data1, data2 = itertools.tee(it)
data2.next()
for a, b in itertools.izip(data1, data2):
  print a, b

2
นั่นคือสิ่งที่ได้รับการแนะนำโดยมด Aasma stackoverflow.com/questions/914715/...
SilentGhost

1

คำตอบนี้เป็นสิ่งที่ OP ควรถามคือสำรวจรายการเปรียบเทียบองค์ประกอบที่ต่อเนื่องกัน ( คำตอบSilentGhost ที่ยอดเยี่ยม) แต่ยังได้รับการสรุปสำหรับกลุ่มใด ๆ ( n-gram ): 2, 3, ... n:

zip(*(l[start:] for start in range(0, n)))

ตัวอย่าง:

l = range(0, 4)  # [0, 1, 2, 3]

list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)]
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 5)))) # == []

คำอธิบาย:

  • l[start:] สร้างรายชื่อ aa / เครื่องกำเนิดเริ่มต้นจากดัชนี start
  • *listหรือ*generator: ผ่านองค์ประกอบทั้งหมดไปยังฟังก์ชั่นการปิดล้อมzipราวกับว่ามันถูกเขียนzip(elem1, elem2, ...)

บันทึก:

AFAIK รหัสนี้ขี้เกียจที่สุดเท่าที่จะทำได้ ไม่ผ่านการทดสอบ

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