Sie können dies mit einem einfachen Motto:
l1 = [1, 2, 3, 'A']
sum(filter(lambda i: isinstance(i, int), l1))
# prints 6
Oder, wenn Sie es brauchen in einer Funktion:
def foo(l1):
return sum(filter(lambda i: isinstance(i, int), l1))
Zusätzlich, wie in den Kommentaren erwähnt, nicht Namen wie verwenden dict
und list
für Ihre Variablen; * Sie überschreiben die eingebauten Namen für die Wörterbücher (dict
) und (list
). Sie müssen dann explizit del dict, list
, um sie wie vorgesehen zu verwenden.
Aber lassen Sie mich erklären. Welche filter
tut, ist hier:
a) es eine Funktion als erstes Argument:
# this function will return True if i is an int
# and false otherwise
lambda i: isinstance(i, int)
und dann in der Liste jedes Element nimmt l1
(zweites Argument) und wertet aus, ob es ist True
oder False
basierend auf der Funktion.
b) Dann wird filter
auszufiltern wesentlichen alle Objekte innerhalb l1
Liste, die keine Instanzen von int
sind (das heißt die Funktion gibt False
für sie). Als Ergebnis wird für eine Liste wie [1, 2, 3, 'A']
Filter [1, 2, 3]
zurückgegeben, die dann von sum()
zusammengefasst werden.
Einige Beispiele:
foo([1, 2, 3, 'A'])
# 6
foo([1, 2, 3])
# 6
foo([1, 2, 3, 'HELLO', 'WORLD'])
# 6
Leichte Einschränkung:
Wie ist, diese float
Werte nicht zusammenzufassen, es fällt ihnen (und alle anderen numerischen Typen für diesen Fall). Wenn Sie das auch brauchen, fügen Sie einfach den float
Typ in der lambda
Funktion als so:
lambda i: isinstance(i, (int, float))
nun Ihre Funktion Summen schwimmt auch:
foo([1, 2, 3, 3.1, 'HELLO', 'WORLD'])
# 9.1
Fügen Sie alle anderen Arten als notwendig in der lambda
Funktion um die Fälle zu erfassen, die Sie brauchen.
Ein Fang alle Fall:
Als @Copperfield von bemerkt können Sie für Objekte überprüfen, die in der numbers
unter Ausnutzung der numbers.Number
abstrakte Basisklasse Instanzen einer beliebigen Anzahl sind Modul. Dies dient als Catch-All-Fall für numerische Werte:
import numbers # must import
sum(filter(lambda i: isinstance(i, numbers.Number), l1))
Einfachere und ein bisschen schneller, auch:
Zusätzlich wird, wie von @ShadowRanger erwähnt, und da lambda
might not be the most comfortable construct for new users, man konnte einfach verwenden a generator expression (das ist auch schneller) mit sum
exakt das gleiche Ergebnis zu erhalten:
sum(val for val in l1 if isinstance(val, numbers.Number))
ersetzen 'Liste [i] .str' mit' str (list [i]) '. – Delgan
Klingt nach Hausaufgaben für mich. –
@ JonasGröger Er hat den Code geschrieben, den er geschrieben hat, denke ich. – Delgan