2015-10-16 13 views
5

Dizelerde bulunan heterojen veri türlerine sahip öğeler listesi var. Bu itibaren

lst=['1','err','-1',' ','155'] 

, sadece pozitif sayılar ile yeni bir listesini elde etmek istiyorum: Ben aşağıda gösterildiği gibi negatif sayılar önlemek için çalıştık new_lst=[1,155]python 3'te heterojen veri türü öğesi içeren bir listeden yalnızca pozitif bir sayı alınıyor 0

. Ancak, ben dizeleri ve boş dizeleri önlemek mümkün değilim:

lst1=int(lst) 
for i in lst1: 
    if i<0: 
    print i 
    else: 
    continue 

Traceback (most recent call last): 
    File "C:/Users/Dev/Documents/Assignment-2/test-2.py", line 22, in <module> 
    c3=int(row[3]) 
ValueError: invalid literal for int() with base 10: 'err' 
>>> 
+0

Olası kopyası [Bir değişkenin tamsayı olup olmadığının kontrol edilmesi] (http://stackoverflow.com/questions/3501382/checking-whether-a-variable-is-an-integer-or-not) – Ryan

+1

Bu Ev ödevi gibi geliyor, bu yüzden size çalışma kodu vermek yerine, nasıl çözüleceğine dair bir fikir vereceğim. İlk önce, listenizi yineleyin ve listedeki her bir öğe için, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Dönüştürme başarılıysa, sayının 0'dan büyük olup olmadığını kontrol edin. Varsa, bunu pozitif sayılar listenize ekleyebilirsiniz. –

+0

"int()" çağrınızı try/except seçeneğine sarın. – RobertB

cevap

2

lst1=int(lst) istisna yükselttiğini koddur. Bu, bir list'u bir int (bunu yapamayacağınız) içine dökmeye çalışmaktadır. Yapmak istediğiniz ne

(bir int gibi) eleman pozitif olup olmadığını kontrol sonra, eleman bir int çevrilebilir belirlemek, lst arasında yineleme ve her eleman içindir. , Bütünlük için ValueError eklendi BigZ cevabı @ bkz:

lst = ['1','err','-1',' ','155'] 
new_lst = [] 

for i in lst: 
    try: 
     int_i = int(i)   # try to cast i to an int 
     if int_i > 0: 
      new_lst.append(int_i) 
    except ValueError:   # ValueError is raised, i cannot be cast into an int 
     pass      # continue to the next element 

DÜZENLEME:


Böyle bir şey yapabilirdi.

3
lst=['1','err','-1',' ','155'] 
newlst = [] 
for i in lst: 
    try: 
     if int(i) >= 0: 
      newlst.append(int(i)) 
    except ValueError: 
     pass 
2

Burada, bir elemanın gerçekten sayı olup olmadığını sınayan tek bir astar vardır. Bu kontrol yapılmazsa, int(x) çalışmayacak ve alamayacak ve istisna olmayacaktır.

lst=['1','err','-1',' ','155'] 
lst1 = filter(None,[(lambda x: x if x.isdigit() and int(x) > 0 else None) (x) for x in lst]) 
1

sadece int'leri varsa ve dikkate varsa "-1"str.isdigit üzerinde başarısız olursa sadece umursamıyorsun olarak str.isdigit yeterlidir pozitif sayılar tutmak istiyorum:

lst[:] = (ele for ele in lst if ele.isdigit() and int(ele) > 0) 

belki daha sonra yüzer var olmadıysa int kullanarak tüm cevaplar ve bir deneyin/hariç de başarısız olur, eğer "1.0" vb. kapsamak istiyorsanız, deneyin içinde yüzmek için döküm gerekir.

İlgili konular