Lồng nhau cho các vòng lặp bằng cách sử dụng tính năng hiểu danh sách


85

Nếu tôi có hai chuỗi 'abc''def', tôi có thể lấy tất cả các kết hợp của chúng bằng cách sử dụng hai vòng lặp for:

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

Tuy nhiên, tôi muốn có thể làm điều này bằng cách sử dụng khả năng hiểu danh sách. Tôi đã thử nhiều cách, nhưng chưa bao giờ đạt được. Có ai biết cách để làm điều này không?

Câu trả lời:


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

hoặc là

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

nếu bạn muốn bộ giá trị.

Giống như trong câu hỏi, for j...là vòng lặp bên ngoài, for k...là vòng lặp bên trong.

Về cơ bản, bạn có thể có bao nhiêu mệnh đề 'for x in y' độc lập như bạn muốn trong danh sách dễ hiểu chỉ bằng cách dán cái này đến cái khác.


1
Điều gì sẽ xảy ra nếu bạn muốn thực hiện vòng lặp lồng nhau để lặp qua một danh sách lồng nhau? Một cái gì đó như: [print ( 'a') cho rìu trong AXS cho AXS trong trục] được in một bó trên [Không có, Không ...] lên đến len (trục)
Pablo Ruiz Ruiz

@Pablo Tôi nghĩ bạn đã đảo ngược vòng lặp. L1 = [[[e1, e2, ...], ...], ...]->[ e for L2 in L1 for L3 in L2 for e in L3 ]
AnOccasionalCashew

Thứ tự của các forcâu lệnh giống như thể bạn đã viết nó thành hai forvòng lặp trên hai dòng riêng biệt.
Boris

aaronasterling Tôi có thể sử dụng câu lệnh điều kiện trong các câu sau không?
Salik Malik

lst = [j+k if BLAHBLAHBLAH for j in s1 for k in s2]hoặc cái gì đó
Salik Malik

34

Vì đây thực chất là một sản phẩm Descartes, bạn cũng có thể sử dụng itertools.product . Tôi nghĩ nó rõ ràng hơn, đặc biệt là khi bạn có nhiều mục đầu vào hơn.

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

0

Hãy thử đệ quy quá:

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))

Cung cấp cho bạn 8 kết hợp:

abc
abf
aec
aef
dbc
dbf
dec
def

Đánh dấu cho câu hỏi của OP, tôi nghĩ rằng đầu ra sẽ cung cấp cho các cặp chữ cái và nên có 9 kết hợp.
Mattia

Điều gì đã xảy ra với: Abd, abe, acd, ace, acf, adb, adc, ade, adf, aeb, aed, afb, afc, afd, afe và tất cả những cái bắt đầu bằng c, e hoặc f? Thậm chí nếu trật tự không quan trọng, bỏ qua là: BDA, ade vv
Harry Binswanger

Cách hoạt động của điều này là vị trí ngoài cùng bên trái chỉ có thể là "a" hoặc "d", vị trí ở giữa chỉ có thể là "b" hoặc "e", và vị trí bên phải chỉ có thể là "c" hoặc "f" .
Stefan Gruenwald
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.