int object is not iterable

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

Hi Leute, es geht um diesem Code:

Code: Alles auswählen

test = [1,1,4,5]

sum_1 = sum(min(test.count(a), test.count(a)) for a in set(test))
print(sum_1) 

for a in (test):
    sum_2 = sum(min(test.count(a), test.count(a)))
    print(sum_2)
Integer Werte sind ja nicht iterierbar. Ich verstehe nicht, warum der obere Code
sum_1 = sum(min(test.count(a), test.count(a)) for a in set(test)) print(sum_1) dann dennoch funktioniert.
for a in set(test)) a ist doch auch in dem Fall ein int oder?

Beim zweiten Beispiel tritt dann die Fehlmeldung TypeError: 'int' object is not iterable auf

Danke
Benutzeravatar
__blackjack__
User
Beiträge: 13138
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@norgsmen: Was denkst Du denn was Du im zweiten Fall an `sum()` übergibst‽ Denn *da* kommt der Fehler her.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6745
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@norgsmen
Im ersten Fall hast du eine Schleife (oder genauer: einen Generator) mit den Ergebnissen von mehreren min()-Aufrufen.
Im zweiten Fall hast du nur das Ergebnis eines einzelnen min()-Aufrufs. Damit kann sum() nichts anfangen.
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man einen komplizierten Ausdruck hat, den man nicht versteht zerlegt man ihn am besten in seine Einzelteile und schaut sich jedes Teil genau an.

Code: Alles auswählen

test = [1,1,4,5]
summanden_1 =(min(test.count(a), test.count(a)) for a in set(test))
print(summanden_1)
print(sum(summanden_1))

for a in test:
    summanden_2 = min(test.count(a), test.count(a))
    print(summanden_2)
    print(sum(summanden_2))
Was siehst du, sind die Unterschiede der beiden Summanden?
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

@snafu Aber dennoch ist es doch so, dass im ersten Fall ein Int Werte übergeben werden. Über Int Werte kann man doch nicht iterieren, wie funktioniert das dann hier?
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

@__blackjack__ Ebenfalls einen integer Wert oder nicht? Daher verstehe ich nicht, wie das im zweiten Fall zu einem Fehler führt und im ersten nicht
Benutzeravatar
snafu
User
Beiträge: 6745
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es wird ein Iterable mit Integer Werten übergeben. Und daraus pickt sich die sum() Funktion die einzelnen Elemente. Das ist etwas anderes als ein einzelner Integer.
Qubit
User
Beiträge: 128
Registriert: Dienstag 7. Oktober 2008, 09:07

norgsmen hat geschrieben: Mittwoch 21. Juni 2023, 22:12 Beim zweiten Beispiel tritt dann die Fehlmeldung TypeError: 'int' object is not iterable auf
Was sagt denn die Doku?
>>> help(sum)
Help on built-in function sum in module builtins:

sum(iterable, /, start=0)
Return the sum of a 'start' value (default: 0) plus an iterable of numbers

When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may
reject non-numeric types.

>>> help(min)
Help on built-in function min in module builtins:

min(...)
min(iterable, *[, default=obj, key=func]) -> value
min(arg1, arg2, *args, *[, key=func]) -> value

With a single iterable argument, return its smallest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the smallest argument.
"sum" will also ein "iterable" fressen, bekommt aber von "min" nur ein "value", in diesem Falle ein "int".

Warum funktioniert das erste Beispiel?

Code: Alles auswählen

>>> test=[1,1,4,5]
>>> param=(min(test.count(a), test.count(a)) for a in set(test))
>>> type(param)
<class 'generator'>
Es wird also ein "iterable" an "sum" übergeben.
Benutzeravatar
snafu
User
Beiträge: 6745
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es hätte ja auch wenig Sinn, wenn die Summenfunktion bloß einen Einzelwert erwarten würde. Woraus sollte dann die Summe gebildet werden?
Benutzeravatar
__blackjack__
User
Beiträge: 13138
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snafu: Na aus dem Inhalt. Ein iterierbares Objekt *selbst* ist ja ein Einzelwert. 😎
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten