Zwracanie maksymalnej wartości zmiennej

0

Witam,

proszę o pomoc, otóż jeśli mam zmienną, która składa się zarówno z liczb, list i elementów tuple, to w jaki sposób zwrócić jej największą wartość?
Chodzi mi o to, że w poniższym przykładzie zwykła funkcja max daje wynik (1,2), co nie jest poprawną wartością, bo powinno być 5.

t = ((5, (1,2), [[1],[2]]))

u = max(t)
print(u)
0

Może rekurencyjnie? Jeśli coś jest tupla/lista wywołaj max dla niej.

Może tu znajdziesz coś do rozpakowania elementow:
www.sahandsaba.com/thirty-python-language-features-and-tricks-you-may-not-know.html

0

co nie jest poprawną wartością, bo powinno być 5.

Nie według Pythona 2 (w 3 nie da się porównać krotki(tuple) z cyfrą)

print (1,2) > 5 

daje True.

1
Serechiel napisał(a):

co nie jest poprawną wartością, bo powinno być 5.

Nie według Pythona 2 (w 3 nie da się porównać krotki(tuple) z cyfrą)

print (1,2) > 5 

daje True.

To znaczy, że w wersji 3, konkretnie 3.6 jest to niewykonalne?

0

Mi przy próbie wyrzuca

TypeError: '>' not supported between instances of 'tuple' and 'int'
0

No ale print(max(max(1,2),5)) już powinno działać, chyba że coś na telefonie pomyliłem?

0

Można to na przykład zrobić tak:


def to_list(x):
    return x if hasattr(x, "__iter__") else [x]


def to_plain_list(li):
    try:
        next(True for i in li if hasattr(i, "__iter__"))
        li = [to_list(i) for i in li]
        li = [i for sub in li for i in sub]
        return to_plain_list(li)
    except StopIteration:
        return li


t = ((5, (1, 2), [[1], [2]]))

t_plain = to_plain_list(t)

print(max(t_plain))

0

Odpowiedz nam, dlaczego 5 ma być wieksze od (1, 2);w jaki sposób Porównujesz tak różne obiekty?
Edit:
Nie daje mi to spokoju, bo może chodziło Ci o znalezienie max w zagnieżdzonym z róznymi typami obiekcie? (to można by pisać jaśniej). Jak tak, to prosty rekurencyjny programik(python3.5):

#4programmers: https://4programmers.net/Forum/Python/293402-zwracanie_maksymalnej_wartosci_zmiennej?p=1384299#id1384299

def rec_max(xs):
    if len(xs) == 0:
        return 0
    else:
        if isinstance(xs[0], int):
            return max(xs[0], rec_max(xs[1:]))
        else:
            return max(rec_max(xs[0]), rec_max(xs[1:]))


print(rec_max([[3, 4], (3, 5), [[3], [6]], 4]))

Widać co robi: jak pierwszy element (głowa) jest liczbą, to bierze max z niej i rekurencyjnie z reszty obiektu, a jeśli nie jest(jest obiektem złożonym), to zwraca max z: najpierw rekurencyjnie z pierwszego elementu i, również rekurencyjnie, z reszty. Tu daje poprawnie 6, nie stosować jednak jako kod produkcyjny- nie był solidnie testowany, ani optymalizowany.

0
lion137 napisał(a):

Odpowiedz nam, dlaczego 5 ma być wieksze od (1, 2);w jaki sposób Porównujesz tak różne obiekty?
Edit:
Nie daje mi to spokoju, bo może chodziło Ci o znalezienie max w zagnieżdzonym z róznymi typami obiekcie? (to można by pisać jaśniej). Jak tak, to prosty rekurencyjny programik(python3.5):

#4programmers: https://4programmers.net/Forum/Python/293402-zwracanie_maksymalnej_wartosci_zmiennej?p=1384299#id1384299

def rec_max(xs):
    if len(xs) == 0:
        return 0
    else:
        if isinstance(xs[0], int):
            return max(xs[0], rec_max(xs[1:]))
        else:
            return max(rec_max(xs[0]), rec_max(xs[1:]))


print(rec_max([[3, 4], (3, 5), [[3], [6]], 4]))

Widać co robi: jak pierwszy element (głowa) jest liczbą, to bierze max z niej i rekurencyjnie z reszty obiektu, a jeśli nie jest(jest obiektem złożonym), to zwraca max z: najpierw rekurencyjnie z pierwszego elementu i, również rekurencyjnie, z reszty. Tu daje poprawnie 6, nie stosować jednak jako kod produkcyjny- nie był solidnie testowany, ani optymalizowany.

Dziękuję za pomoc. Masz rację, byłem zbyt mało precyzyjny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1