2013-04-01 16 views
5

Hala python öğreniyorum ama bu kod benim seviyemin ötesinde görünüyor. bu ne anlama geliyor?Lütfen bu python kodunun ne anlama geldiğini bana açıklayınız.

pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] 
+2

Daha önce liste anlamalarını gördünüz mü? Ve eğer öyleyse, [bu soru] 'u okumaya çalıştınız mı (http://stackoverflow.com/questions/1198777/double-iteration-in-list-comprehension)? –

+0

"s1" dizgesindeki dizeleri, ayırıcı olarak ";" ile böler ve bu bölünmüş listenin her öğesinde, '&' sınırlayıcı olarak ayırırsınız. ikinci bir liste olarak "çiftleri" – Tuxdude

+0

bölünmüş [hakkında her şey için] hakkında bilgi için "liste anlama" içine bakmak gerekir. Snippet'inizle ilgili daha fazla yorum için qs nesnesinde ayrıntı sağlamanız gerekir. Bununla birlikte, bir dize olduğu varsayılarak, for-in yinelemeleri, (& and ;) – wirrbel

cevap

11

Böyle bir eşdeğer açık döngü herhangi bir liste anlama dönüştürebilirsiniz:

pairs = [] 
for s1 in qs.split('&'): 
    for s2 in s1.split(';'): 
     pairs.append(s2) 

kural for ve if tüm maddeler almaktır, göründükleri sırayla yuva bunları ve daha sonra foo için append(foo) ilk maddeden önce gelir.

List Comprehension'daki öğretici bölüm (ve Yuvalanmış Liste Anlamalarındaki alt bölüm) bunu açıklar ... ancak herhangi bir kavrayışı iç içe bir blok deyimine dönüştürmek için basit bir kuralı vermez (ki bence) önemsiz vakaların hepsini anlamak daha kolay. Ayrıca, urllib.parse.parse_qsl (veya 2.x içinde urlparse.parse_qsl) sorgu dizelerini ayrıştırmanın daha iyi bir yolu olduğunu da belirtmek gerekir. Okuması zor bir yuvalanmış liste kavramasını içermemesinin yanı sıra, önceden düşünemeyeceğiniz her türlü şeyi (alıntılama gibi) düzgün bir şekilde ele alır ve sonuçlarınızdan biri için hata ayıklama yapar. yararlı hata raporlarını nasıl göndereceğini bilmeyen kullanıcılar.

+3

+1. Utanç verici bir şekilde uzun bir süre boyunca beynim her zaman iç içe geçmiş listcomps'leri okumayı denedi, çünkü eşdeğeri olan kısmın "en derin" kısım olduğunu biliyordum ve bu ilk önce geldi, bu yüzden onu en derinden "yukarı doğru" yazdığını düşündüm. Sonra bir gün, bir kişi "liste kavramalarının döngü kısmını döngüleri yazdığınız sırayla yazıyorsunuz, bu çok zor?" ve yaptığın örneği verdin. O zamandan beri, tüm açıktı .. – DSM

+0

Tüm yardım için çok teşekkürler. Şimdi anlıyorum. En karışık kısım ilk s2. İlk için çıkış ve ikincisi iç döngüdür. Böylece ilk s2, içsel olan s2'nin çıkışını alır. Anladım. –

+0

@DSM: Evet, aynı sorun vardı. Sadece iç içe olmayan anlamalarla ilgilenirseniz, onları dışarıdan okuyabilirsiniz. Ama bir kez iç içe geçtiklerinde, _actual_ kuralının dışarıda olduğunu öğrenmelisiniz. (Ve sonra, genexps ile uğraşırken, en dıştaki yineleyicinin aslında tüm ifadenin dışına çıktığını ve bunu daha da eğlenceli hale getireceğini öğrenmelisiniz…) – abarnert

İlgili konular