Seite 1 von 1

int object is not iterable

Verfasst: Mittwoch 21. Juni 2023, 22:12
von norgsmen
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

Re: int object is not iterable

Verfasst: Mittwoch 21. Juni 2023, 22:19
von __blackjack__
@norgsmen: Was denkst Du denn was Du im zweiten Fall an `sum()` übergibst‽ Denn *da* kommt der Fehler her.

Re: int object is not iterable

Verfasst: Donnerstag 22. Juni 2023, 05:04
von snafu
@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.

Re: int object is not iterable

Verfasst: Donnerstag 22. Juni 2023, 05:05
von Sirius3
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?

Re: int object is not iterable

Verfasst: Donnerstag 22. Juni 2023, 07:45
von norgsmen
@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?

Re: int object is not iterable

Verfasst: Donnerstag 22. Juni 2023, 07:48
von norgsmen
@__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

Re: int object is not iterable

Verfasst: Donnerstag 22. Juni 2023, 09:13
von snafu
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.

Re: int object is not iterable

Verfasst: Donnerstag 22. Juni 2023, 10:30
von Qubit
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.

Re: int object is not iterable

Verfasst: Donnerstag 22. Juni 2023, 14:18
von snafu
Es hätte ja auch wenig Sinn, wenn die Summenfunktion bloß einen Einzelwert erwarten würde. Woraus sollte dann die Summe gebildet werden?

Re: int object is not iterable

Verfasst: Donnerstag 22. Juni 2023, 14:23
von __blackjack__
@snafu: Na aus dem Inhalt. Ein iterierbares Objekt *selbst* ist ja ein Einzelwert. 😎