ฉันจะเปรียบเทียบตัวเลขจากรายการกับหมายเลขถัดไป (เพื่อนบ้าน) ได้อย่างไร

ทั้งหมดที่ฉันต้องการทำคือเปรียบเทียบหมายเลขแรกจากรายการกับหมายเลขที่สองจากรายการเดียวกัน หมายเลขที่สองกับหมายเลขที่สาม และอื่นๆ

ป้อนข้อมูล:

lst = [1,2,3,2,1]

เอาท์พุท:

result = ["Lower", "Lower", "Higher", "Higher"]

(1 ต่ำกว่า 2, 2 ต่ำกว่า 3, 3 สูงกว่า 2, 2 สูงกว่า 1)

มันค่อนข้างน่าเกลียด (ความเข้าใจในรายการจะดีมาก) แต่แนวทางของฉันสำหรับสิ่งนั้นคือ:

lst = [1,2,3,2,1]
result = []
x = 0

try:
    for i in range(len(lst)):
        if lst[x] > lst[x+1]:
            result.append("Higher")
            #print("Higher")
        else:
            result.append("Lower")
            #print("Lower")
        x = x+1
except IndexError:
    print(result)
    print("Out of range")

person edward    schedule 31.05.2020    source แหล่งที่มา
comment
มันได้ผลเหรอ? ถ้าเป็นเช่นนั้น คำถามของคุณคืออะไร? ถ้าไม่เช่นนั้นปัญหาคืออะไร?   -  person mkrieger1    schedule 01.06.2020
comment
มันใช้งานได้ในแบบของฉัน แต่บล็อกมันน้อยเกินไปสำหรับการดำเนินการง่ายๆ นี้ และฉันไม่สามารถหาวิธีทำให้สั้นที่สุดเท่าที่จะเป็นไปได้ เช่น รายการความเข้าใจ ซึ่งฉันได้รับในคำตอบ :)   -  person edward    schedule 01.06.2020


คำตอบ (5)


นี่คือรายการความเข้าใจ

['Higher' if lst[i] > lst[i + 1] else 'Lower' for i in range(len(lst) - 1)]
person Mitch    schedule 31.05.2020

เนื่องจากสตริง higher และ lower ของคุณโดยพื้นฐานแล้วเป็นพร็อกซีสำหรับบูลีนที่มากกว่า/น้อยกว่า คุณจึงสามารถทำให้สิ่งนี้ดูสะอาดตาได้ด้วย:

lst = [1,2,3,2,1]

vals = ['higher', 'lower']

[vals[m < n] for m, n in zip(lst, lst[1:])]
# ['lower', 'lower', 'higher', 'higher']
person Mark    schedule 31.05.2020

ใช้ zip() เพื่อวนซ้ำรายการ:

lst = [1,2,3,2,1]

out = []
for a, b in zip(lst, lst[1:]):
    out.append('Higher' if a > b else 'Lower')

print(out)

พิมพ์:

['Lower', 'Lower', 'Higher', 'Higher']
person Andrej Kesely    schedule 31.05.2020
comment
สะอาดกว่าของฉันมาก ขอบคุณ! มิทเชล เปาลินตอบด้วยรายการความเข้าใจ ฉันจะใช้สิ่งนั้น - person edward; 01.06.2020
comment
ไม่มีอะไรหยุดคุณจากการเปลี่ยนรายการนี้เป็นรายการความเข้าใจซึ่งฉันคิดว่าออกมาดีและชัดเจน ควรจะค่อนข้างเร็วเช่นกัน - ['สูงกว่า' ถ้า a › b else 'Lower' สำหรับ a, b ใน zip(lst, lst[1:])] - person tgrtim; 01.06.2020

คุณมีความคิดที่ถูกต้องเกี่ยวกับกระบวนทัศน์ try/except แต่คุณกำลังพันลูปทั้งหมดไว้ในบล็อกลอง สิ่งที่คุณต้องการแทนคือละเว้นเฉพาะดัชนีที่เกิด IndexError ดังนั้นลองสิ่งนี้:

lst = [1,2,3,2,1]
result = []
x = 0

for i in range(len(lst)):
    try:
        if lst[x] > lst[x+1]:
            result.append("Higher")
            #print("Higher")
        else:
            result.append("Lower")
            #print("Lower")
        x = x+1
    except IndexError:
        print(result)
        print("Out of range")

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

lst = [1,2,3,2,1]
result = []
for i in range(len(lst)-1):
    a = lst[i]
    b = lst[i+1]

    if a<b:
        result.append("Lower")
    else:
        result.append("Higher")

แน่นอนว่าคุณสามารถทำทุกอย่างได้ในคราวเดียว

result = [("Lower", "Higher")[lst[i]>lst[i+1]] for i in range(len(lst)-1)]

หรือแย่กว่านั้น:

result = [("Lower", "Higher")[a>b] for a,b in zip(lst, lst[1:])]
person inspectorG4dget    schedule 31.05.2020

ไม่ใช่รายการความเข้าใจ แต่อาจจะชัดเจนกว่าสำหรับผู้ที่ไม่ใช่งูหลาม:

lst = [1,2,3,2,1]
result = []
x = 0

for i in range(len(lst)-1):
  comp_result = "Higher" if lst[i] > lst[i+1] else "Lower"
  result.append(comp_result)

print(result)
person adamgy    schedule 31.05.2020