2012-04-24 19 views
27

Ödev operatörünü liste anlaşmasında kullanmak istiyorum. Bunu nasıl yapabilirim?Liste anlamada ödevleri nasıl yapabilirim?

Aşağıdaki kod geçersiz sözdizimidir. Ben pattern eşleşirse boş bir dizeye '' için lst[0] ayarlamak demek:

[ lst[0] = '' for pattern in start_pattern if lst[0] == pattern ] 

Teşekkür!

+3

Sanırım bunun içinizde var ... – dawg

+4

Bu çok net değil. Bu bir anlık uyarı işareti. –

cevap

20

Python'da looping constructs ile list comprehension karıştırıyor gibi görünüyor.

Bir liste anlama üretir - bir liste! Mevcut bir listede tek bir ödeve kendini ödünç vermez. (Bunu yapmak için sözdizimine işkence edebilirsiniz ...)

Kodunuzdan ne yapmaya çalıştığınız tam olarak net olmasa da, listenin üzerinde geçiş yapmaya daha benzer olduğunu düşünüyorum (akış denetimi) bunu yapmak için makul bir yol olduğunu ve C, Pascal, vb Ama senin ne yapacağını olduğunu

for pattern in patterns: 
    if lst[0] == pattern: lst[0]='' 

:

Döngü böyle liste üzerinde (liste anlama) listesinin meydana vs Ayrıca, sadece bir değer için listeyi test edebilir ve değiştirebilir:

if lst[0] in patterns: lst[0] = '' 

Veya, endeksi bilmiyorsanız:

i=lst.index[pattern] 
lst[i]='' 

ya, listelerin listesi var ve her alt liste her birinci elemanını değiştirmek isterseniz:

for i, sublst in enumerate(lst): 
    if sublst[i][0] in patterns: sublist[i][0]='' 

vb vb.

Bir listenin her elemanına bir şey uygulamak isterseniz, liste kavrama, harita veya Python kitindeki diğer birçok araçtan birini kullanarak bakabilirsiniz.

Şahsen ben genellikle daha liste oluşturulması için liste türetimi kullanma eğiliminde: fazlasıdır listelerinin aynı listesini değiştirmek için

l=[] 
for i in range(4): 
    l.append([]) 
    for j in range(5): 
     l[i].append(j)  

Ama: daha doğal olduğu

l=[[ x for x in range(5) ] for y in range(4)] #init a list of lists... 

anlaşılabilir?

Bu:

l=[['new value' if j==0 else l[i][j] for j in range(len(l[i]))] for i in range(len(l))] 

veya bu:

for i,outter in enumerate(l): 
    l[i][0]='new value'    

YMMV

Here bu büyük bir öğretici olduğunu.

+3

Ve bu, lst [0] desenlerinde: lst [0] = '' 'şeklinde yazılmalıdır. –

+1

@Tim: Bunu bir cevap olarak gönderin! Bunu yapmanın başka üç yolu ile geldiğime inanamıyorum ... ;-) – Cameron

+0

@Tim Pietzcker: bunu yazmamın yolunu çizdim, ama ben (benim yorumumu) Bu içten vardı ... – dawg

4

Özetle: yapmıyorsunuz. Listeyi anlatan listeler mevcut listelerde değişiklik yapmamak için listeler oluşturuyor. Bir listeyi değiştirmek isterseniz, bir for döngüsü kullanın.

olacağını kod yazmak Pythonictir yolu gibi bir şey:

for pattern in start_pattern: 
    if lst[0] == pattern: 
     lst[0] = '' 
     #the following assumes that pattern will never be '' 
     #if that's possible, you can ignore this bit 
     break 

Ancak, gerçekten, gerçekten birinin içinde atama yapmak istiyorum ve her zamankinden ile ilgilenen her Python programcısı sakıncası yoksa senin kod sonsuza ondan nefret, birkaç fonksiyonları kullanabileceğiniz vardır: Eğer atamak istediğiniz değişken bir küresel ise

  • , o zaman yapabilirsiniz

    globals().update(var=value) 
    
  • sen atamak istediğiniz değişken bir değişken dizisi ya da (böyle bir liste veya dict) bir harita ise

    list.__setitem__(index, value) 
    
+0

Ara her zaman geçerlidir. Verilerde bir '' 'bile olsa, sadece lst [0] 'ın aynı değere yeniden atanmasına neden olur ... – Cameron

+0

Parça atamasının takip edilmesi için eleman atamasının aşırı yüklendiği bir değişken dizidir. Belirli bir değerin kaç kez veya standart dışı davranışların bir kaç kez verildiği. –

+0

Hmm, iyi nokta. Umarım bu çok nadir bir durumdur, ancak :-) – Cameron

7

Python dil ifadeler ve tablolar için farklı kavramlar vardır.

Atama açıklamada olsa bile bu bir deyim (örn a=b=99 çalışır ancak özel bir sözdizimi durumdur ve C örneğin olduğu gibi b=99 bir ifade olduğu anlamına gelmez) düşünce içine bazen sözdizimi aldatmaya çalışmasıdır.

Listeyi anlama, bunun yerine bir değer döndürdüğünden, bunun yerine bir döngü döndürdüğü için bir ifadedir ve ana nokta döndürülen listedir.

Bir ifade ifadeler içerebilir, ancak bir ifade ifadeleri içeremez. Bununla birlikte, liste öğesi ifadesinin dahili olarak bir yöntem çağrısına dönüştürüldüğünü (liste benzeri nesnelerin oluşturulmasına izin vermek için) ve yöntem çağrılarının ifadeler olduğunu belirtmiştir. Bu nedenle olabildiğince bir ifadedeki teknik kullanım liste öğesi atama: okunabilirliği zarar ve ne kadar kolay kaynak kodu Python dilinde ana odak okumak için çünkü

[ lst.__setitem__(0, '') for pattern in start_pattern if lst[0] == pattern ] 

Ancak bu kötü olarak kabul edilir. Sen

for pattern in start_pattern: 
    if lst[0] == pattern: 
     lst[0] = '' 

in operatöre yolu sayesinde tarafından bile daha okunabilir

if lst[0] in start_pattern: 
    lst[0] = '' 

Liste comprehensions denk olduğunu

onların dönüş değeri için kullanılır ... yerine örneğin yazmalı ve yaptıkları içsel bir döngü ... Eğer istediğiniz şey ilmiyse o zaman sadece bir döngü yazınız ... ne okuyacağını anlamaya çalışan kodu okuyacak olan kimsenin çok fazla takdir edeceğini (ve bir kaç hafta içinde kendinizi dahil edin).

İlgili konular