2016-03-31 51 views
0

listesini oluşturmak için bir liste oluşturmalıyım (her bir iç liste n sabit öğeye sahiptir). Şu anda, n=3 için bunu yapıyorum: Ben liste anlama çalıştığımdapython listesi python

şey gibi
my_list = [] 
for x in range(min_inner max_inner + 1): 
    for y in range(min_outer, max_outer + 1): 
     for z in range(fixed_param): 
      my_list.append([x, y, z]) 

:

[[x,y,z] for x in range(1,4), y in range(1,4), z in range (4)]

Ben bir isim hatası alıyorum

NameError: name 'z' is not defined

mi Bunu yapmanın bir listesini anlama yolu var mı? n'un herhangi bir sayı olabileceği düşünüldüğünde (her ne kadar zorunlu olarak büyük olmasa da)

+0

Her yer için ekle '[[x, y, z] x aralığında aralık için (1,4) y için aralıkta (1,4) z aralığında (4)]' ... –

+1

Bir kavrayışa dikkat edin sadece kodunuzu dikey yerine yatay yapar. Geleneksel döngüler otomatik olarak kötü değildir. – TigerhawkT3

cevap

3

Liste kapsamı içinde aralık nesnelerinize de dönmeniz gerekir.

from itertools import product  
list(product(range(1,4),range(1,4),range(4))) 

Not itertools.product() o döner oldukça fazla (bellek kullanımı açısından) optimize edilmiş bir yineleyici nesne daha: Eğer aynı sonucu elde etmek itertools.product() kullanabileceği bir daha özlü yolu olarak da

[[x,y,z] for x in range(1,4) for y in range(1,4) for z in range (4)] 

Bir liste döndüren liste kavraması. Ve sadece sonuç üzerinde yinelemek istiyorsanız sonucu listeye dönüştürmenize gerek yoktur. Aksi takdirde liste kavraması daha hızlı gerçekleşir.

+2

Ürünün l listesi için liste [l (l) (aralık (1, 4), aralık (1, 4), aralık (1,4))] 'ilk çözümdekiyle aynı olmalıdır. Liste –

+0

@AntonProtopopov Bu durumda liste kavrama daha iyi olurdu. Ama eğer, tupleleri listeye çevirmek demek istiyorsan, evet bu da iyi bir yaklaşım. – Kasramvd

+0

@Kasramvd iter araçların 'product' kullanımı ile birlikte @Anton Protopopov listeye dönüştürme ihtiyacım uygun! ikinize de teşekkürler :) – okkhoy