ซ้อนสำหรับลูปโดยใช้ความเข้าใจรายการ


88

ถ้าฉันมีสองสาย'abc'และ'def'ฉันสามารถหาชุดค่าผสมทั้งหมดได้โดยใช้สองสายสำหรับลูป:

for j in s1:
  for k in s2:
    print(j, k)

อย่างไรก็ตามฉันต้องการดำเนินการนี้โดยใช้ความเข้าใจในรายการ ฉันลองมาหลายวิธีแล้ว แต่ไม่เคยได้รับเลย ไม่มีใครรู้วิธีการทำเช่นนี้?

คำตอบ:


136
lst = [j + k for j in s1 for k in s2]

หรือ

lst = [(j, k) for j in s1 for k in s2]

ถ้าคุณต้องการ tuples

เช่นเดียวกับในคำถามfor j...คือวงนอกfor k...คือวงใน

โดยพื้นฐานแล้วคุณสามารถมีประโยค 'for x in y' ที่เป็นอิสระได้มากเท่าที่คุณต้องการในการทำความเข้าใจรายการเพียงแค่ติดกัน


1
จะเกิดอะไรขึ้นถ้าคุณต้องการทำลูปที่ซ้อนกันเพื่อวนซ้ำในรายการที่ซ้อนกัน? สิ่งที่ชอบ: [พิมพ์ ('a') สำหรับขวานในแกนสำหรับขวานในแกน] กำลังพิมพ์พวงที่ [ไม่มี, ไม่มี ... ] จนถึง len (แกน)
Pablo Ruiz Ruiz

@Pablo ฉันคิดว่าคุณมีการย้อนกลับของลูป L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew

ลำดับของforคำสั่งจะเหมือนกับว่าคุณเขียนเป็นสองforลูปในสองบรรทัดแยกกัน
Boris

aaronasterling ฉันสามารถใช้เงื่อนไขต่อไปนี้ได้หรือไม่?
Salik Malik

lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]หรืออะไรสักอย่าง
Salik Malik

35

เนื่องจากเป็นผลิตภัณฑ์คาร์ทีเซียนเป็นหลักคุณจึงสามารถใช้itertools.productได้ ฉันคิดว่ามันชัดเจนกว่าโดยเฉพาะอย่างยิ่งเมื่อคุณมีอินพุตซ้ำมากขึ้น

itertools.product('abc', 'def', 'ghi')

0

ลองเรียกซ้ำด้วย:

s=""
s1="abc"
s2="def"
def combinations(s,l):
    if l==0:
        print s
    else:
        combinations(s+s1[len(s1)-l],l-1)
        combinations(s+s2[len(s2)-l],l-1)

combinations(s,len(s1))

ให้คุณได้ 8 ชุด:

abc
abf
aec
aef
dbc
dbf
dec
def

จากคำถามของ OP ฉันคิดว่าผลลัพธ์ควรให้ตัวอักษรคู่กันและควรมี 9 ชุด
Mattia

เกิดอะไรขึ้นกับ: abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe และทุกอย่างที่ขึ้นต้นด้วย c, e หรือ f? แม้ว่าคำสั่งซื้อจะไม่สำคัญ แต่ละเว้นคือ bda, ade เป็นต้น
Harry Binswanger

วิธีการทำงานนี้คือตำแหน่งซ้ายสุดจะเป็น "a" หรือ "d" เท่านั้นตำแหน่งกลางจะต้องเป็น "b" หรือ "e" เท่านั้นและตำแหน่งที่ถูกต้องต้องเป็น "c" หรือ "f" เท่านั้น .
Stefan Gruenwald
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.