Baris Tunggal Bersarang Untuk Loop


102

Tuliskan fungsi ini dengan python yang mengubah sebuah matriks:

def transpose(m):
    height = len(m)
    width = len(m[0])
    return [ [ m[i][j] for i in range(0, height) ] for j in range(0, width) ]

Dalam prosesnya, saya menyadari bahwa saya tidak sepenuhnya memahami bagaimana satu baris bersarang untuk eksekusi loop. Tolong bantu saya memahami dengan menjawab pertanyaan-pertanyaan berikut:

  1. Apa urutan eksekusi loop for ini?
  2. Jika saya memiliki tiga kali lipat untuk loop, urutan apa yang akan dieksekusi?
  3. Apa yang sama dengan for loop tidak bertepi?

Diberikan,

[ function(i,j) for i,j in object ]
  1. Jenis objek apa yang harus digunakan untuk menggunakan struktur loop for ini?
  2. Berapakah urutan i dan j yang ditetapkan ke elemen dalam objek?
  3. Bisakah itu disimulasikan oleh struktur loop for yang berbeda?
  4. Dapatkah perulangan for ini disarangkan dengan struktur perulangan for yang serupa atau berbeda? Dan bagaimana tampilannya?

Informasi tambahan juga dihargai.

Jawaban:


169

Sumber informasi terbaik adalah tutorial resmi Python tentang pemahaman daftar . Pemahaman daftar hampir sama dengan for loop (tentu saja pemahaman daftar apa pun dapat ditulis sebagai loop-for) tetapi seringkali lebih cepat daripada menggunakan for loop.

Lihatlah pemahaman daftar yang lebih panjang ini dari tutorial ( ifbagian menyaring pemahaman, hanya bagian yang melewati pernyataan if yang diteruskan ke bagian akhir dari pemahaman daftar (di sini (x,y)):

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Ini persis sama dengan loop for bersarang ini (dan, seperti yang dikatakan tutorial, perhatikan bagaimana urutan for dan if adalah sama).

>>> combs = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Utama perbedaan antara daftar pemahaman dan untuk loop adalah bahwa bagian akhir dari untuk loop (di mana Anda melakukan sesuatu) datang pada lebih awal daripada di akhir.

Tentang pertanyaan Anda:

Jenis objek apa yang harus digunakan untuk menggunakan struktur loop for ini?

Sebuah iterable . Objek apa pun yang dapat menghasilkan sekumpulan elemen (terbatas). Ini termasuk wadah, daftar, set, generator, dll.

Berapakah urutan i dan j yang ditetapkan ke elemen dalam objek?

Mereka ditugaskan dalam urutan yang persis sama seperti yang dihasilkan dari setiap daftar, seolah-olah mereka berada dalam loop for bersarang (untuk pemahaman pertama Anda, Anda akan mendapatkan 1 elemen untuk i, lalu setiap nilai dari j, elemen ke-2 menjadi i, lalu setiap nilai dari j, dll.)

Bisakah itu disimulasikan oleh struktur loop for yang berbeda?

Ya, sudah ditunjukkan di atas.

Dapatkah perulangan for ini disarangkan dengan struktur perulangan for yang serupa atau berbeda? Dan bagaimana tampilannya?

Tentu, tapi itu bukan ide yang bagus. Di sini, misalnya, memberi Anda daftar daftar karakter:

[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]

Saya bertanya-tanya apa yang memandu pilihan pemesanan di double nesting. Saya menemukan cara lain yang lebih alami (untuk y lalu untuk x dalam contoh Anda). Saya baru menyadari bahwa setelah 3 tahun melakukan python (tidak secara ekstensif tetapi masih ...) dan menggunakan loop semacam itu !!
Thomas

@Thomas Saya juga menemukan cara lain yang lebih intuitif. Pilihan yang saya yakini murni kenyamanan. Melakukannya dengan cara yang lebih intuitif berarti harus berurusan dengan simbol-simbol yang belum terselesaikan sampai itu akan menemukannya nanti dalam pernyataan. Coba parsing untuk tiap banana.peel di tiap pisang untuk tiap kota.bananastore di tiap kota di atas kertas. Tidak semudah itu. Namun sebaliknya, bagus dan mudah.
Pyjong

29

Anda mungkin tertarik itertools.product, yang mengembalikan tupel nilai yang dapat diulang dari semua iterable yang Anda lewati. Artinya, itertools.product(A, B)menghasilkan semua nilai bentuk (a, b), dari mana anilai - nilai itu berasal Adan bnilai - nilai itu berasal B. Sebagai contoh:

import itertools

A = [50, 60, 70]
B = [0.1, 0.2, 0.3, 0.4]

print [a + b for a, b in itertools.product(A, B)]

Ini mencetak:

[50.1, 50.2, 50.3, 50.4, 60.1, 60.2, 60.3, 60.4, 70.1, 70.2, 70.3, 70.4]

Perhatikan bagaimana argumen terakhir yang diberikan itertools.productadalah yang "di dalam". Umumnya sama denganitertools.product(a0, a1, ... an)[(i0, i1, ... in) for in in an for in-1 in an-1 ... for i0 in a0]


4

Pertama-tama, kode pertama Anda tidak menggunakan perulangan for, tetapi pemahaman daftar .

  1. Akan setara dengan

    untuk j dalam rentang (0, lebar): untuk i dalam rentang (0, tinggi): m [i] [j]

  2. Dengan cara yang hampir sama, umumnya sarang seperti untuk loop, dari kanan ke kiri. Tetapi sintaks pemahaman daftar lebih kompleks.

  3. Saya tidak yakin apa pertanyaan ini


  1. Objek iterable apa pun yang menghasilkan objek iterable yang menghasilkan tepat dua objek (seteguk - artinya [(1,2),'ab']valid)

  2. Urutan di mana objek menghasilkan setelah iterasi. ipergi ke hasil pertama, jkedua.

  3. Ya, tapi tidak secantik itu. Saya yakin ini secara fungsional setara dengan:

    l = daftar ()
    untuk i, j dalam objek:
        l.append (fungsi (i, j))
    

    atau bahkan lebih baik menggunakan peta :

    map(function, object)

    Tapi tentu saja fungsi harus mendapatkan i, jitu sendiri.

  4. Bukankah ini pertanyaan yang sama dengan 3?


2

Anda dapat menggunakan dua for loop di baris yang sama dengan menggunakan zipfunction

Kode:

list1 = ['Abbas', 'Ali', 'Usman']
list2 = ['Kamran', 'Asgar', 'Hamza', 'Umer']
list3 = []
for i,j in zip(list1,list2):
    list3.append(i)
    list3.append(j)
print(list3)

Keluaran:

['Abbas', 'Kamran', 'Ali', 'Asgar', 'Usman', 'Hamza']

Jadi, dengan menggunakan fungsi zip, kita bisa menggunakan dua for loop atau kita bisa mengulang dua list di baris yang sama.


-1

Kode di bawah ini untuk contoh terbaik untuk loop bersarang, sementara menggunakan dua untuk loop, harap diingat bahwa output dari loop pertama adalah input untuk loop kedua. Penghentian loop juga penting saat menggunakan loop bersarang

for x in range(1, 10, 1):
     for y in range(1,x):
             print y,
        print
OutPut :
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.