2017-06-12 2 views
0

Ich habe die folgende Funktion ausprobiert. Das soll eine Liste von Listen bekommen, überprüfen, ob jede seiner Unterlisten einen int-Wert enthält, es in int umwandeln, oder wenn es nicht tut, es löschen. Um dies zu tun, soll dies ein newX erzeugen, das eine neue Unterliste mit nichts als ints wäre, und eine neue Liste, die die Unterlisten enthalten würde.Wie beschneide ich die Werte aus einer Liste von Listen, die nicht int sind?

Ich habe es geschafft, die Werte aus der Unterliste zu bekommen, aber ich kann mich nicht darum kümmern, wie man die Werte jeder Unterliste wieder in x setzt. Da ich jetzt eine neue Unterliste erstelle, brauche ich eine ganz neue Liste von Listen und ich bin wirklich verwirrt über die ganze Sache. Es muss einen leichteren Weg geben.

def forceInt(list): 
    newList = [] 
    for x in list: 
     newX = [] 
     for y in x: 
      try: 
       int(y) 
      except: 
       continue 
      else: 
       newX.append(int(y)) 
     newList.append(newX) 
    return newList 

print(forceInt(adsVal)) 

Probeneingang:

adsVal = [['Students', 'inactive', '3'], ['Campaign 1', 'not_delivering', '']] 

Beispielausgabe:

[['3'], []] 
+0

Das ist nicht eine Liste von Listen ist, sondern ein dict von Listen ... –

+0

Meine schlecht, lassen Sie es mich –

+0

beheben, aber warum ist dann ' 'Students'' und "Kampagne 1" ist immer noch Teil der Ausgabe? –

Antwort

3

können Sie verschachtelte verwenden dict Verständnis mit str.isdigit() Filter wie:

>>> adsVal = {'Students': ['inactive', '3'], 'Campaign 1': ['not_delivering', '']} 

#       v returns `True` if the string is a digit 
>>> {k:[vv for vv in v if vv.isdigit()] for k, v in adsVal.items()}} 
{'Students': ['3'], 'Campaign 1': []} 

Edit: Basierend auf der Bearbeitung in der Frage, dict verständigen sion ist nicht erforderlich.Um die Liste der Werte zu erhalten, können Sie Liste Verständnis Ausdruck verwenden wie:

>>> [[vv for vv in v if vv.isdigit()] for v in adsVal.values()] 
[['3'], []] 
+2

Die Spezifikationen haben sich ein wenig geändert, also sollte vielleicht die Antwort aktualisiert werden. Trotzdem +1 um es eher elegant zu lösen. –

+1

@WillemVanOnsem Vielen Dank, dass Sie auf die Updates in der Frage hingewiesen haben. Ich schätze es! –

+0

Die Wörterbuchform ist auch nützlich! Vielen Dank! –

3

Falls Sie mit einer Liste von Listen arbeiten wollen, können Sie einfach geschachtelt verwenden Liste Verständnis :

[[v for v in vs if isinstance(v,int)] for vs in data] 

(wobei data die ursprüngliche Liste ist). Dies erzeugt:

>>> [[v for v in vs if isinstance(v,int)] for vs in data] 
[[], []] 

Dennoch Ihre Beispielliste ist keine int s enthalten: es enthält str Ings, die Zahlen darstellen . In diesem Fall sollten Sie str.isdigit() verwenden:

[[v for v in vs if v.isdigit()] for vs in data] 

dies erzeugt:

>>> [[v for v in vs if v.isdigit()] for vs in data] 
[['3'], []] 
+0

Ich liebe, wie alles in einer Linie ist! Es ist so elegant! Ich werde diesen nehmen. Danke :) –

4

Es ist ein bisschen ausführlicher, aber hier ist mein nehmen:

adsVal = {'Students': ['inactive', '3'], 'Campaign 1': ['not_delivering', '']} 

def check(value): 
    try: 
     int(value) 
     return True 
    except ValueError: 
     return False 

res = {k: [x for x in v if check(x)] for k, v in adsVal.items()} 
print(res) # {'Students': ['3'], 'Campaign 1': []} 

Jetzt für Ihre bearbeiten, wenn Sie eine Liste von Listen haben, die Sie die gleiche Logik anwenden können:

adsVal = [['Students', 'inactive', '3'], ['Campaign 1', 'not_delivering', '']] 

def check(value): 
    try: 
     int(value) 
     return True 
    except ValueError: 
     return False 

res = [[x for x in sub if check(x)] for sub in adsVal] 
print(res) # [['3'], []] 
+0

Es funktioniert! Ich werde eine Weile brauchen, um es zu verstehen, aber danke! :) –

+1

@MiguelAlberolaCano Siehe die Bearbeitung für die Liste der Listen –

+0

Ich habe es auch überprüft, danke! –

3

Sie können tun

In [1]: adsVal = [['Students', 'inactive', '3'], ['Campaign 1', 'not_delivering', '']] 
In [2]: map(lambda x: filter(str.isdigit, x), adsVal) 
Out[2]: [['3'], []] 

PY3

In [3]: list(map(lambda x: list(filter(str.isdigit, x)), adsVal)) 
Out[3]: [['3'], []] 
+0

Beachten Sie, dass in Python-3.x Generatoren und keine Listen generiert werden. –

+0

Aktualisiert @WillemVanOnsem – itzMEonTV

+0

Ich bin verwirrt darüber, was In und Out bedeuten: S –

Verwandte Themen