To jest mój kod (prawda):

 if __name__ == '__main__':
    n = int(input())
    arr = map(int, input().split())
    l = list(set(sorted(arr)))
    l.remove(max(l))
    print(max(l))

Ale chcę to zrobić (Pythonic):

if __name__ == '__main__':
    n = int(input())
    arr = map(int, input().split())
    l = list(set(sorted(arr)))
    print(l.remove(max(l)))

Więc .. Kiedy robię to mój kod, wystrukuj:

Drukuj (L.Remove (max (L)))

Żaden

Jaki jest problem? Chcę tylko uprościć mój kod.

Zadanie: Mam listę i chcę wydrukować drugi maksymalny wynik.

1
WSS 4 czerwiec 2018, 16:50

3 odpowiedzi

Najlepsza odpowiedź

Konwertuj obiekt mapy do zestawu za pomocą {x0}}, konwersja do posortowanej listy za pomocą sorted() i weź drugiego ostatniego elementu z [-2]:

print(sorted(set(arr))[-2])

Moim zdaniem jest to bardziej pytaniowe niż wyjmowanie maksimum, a następnie drukowanie nowego max, ponieważ jest wyraźniejszy i osiągnięty w mniejszych krokach.

2
Joe Iddon 4 czerwiec 2018, 14:26

Powinieneś użyć a Heap zamiast sortowania. Możesz zbudować stertę w czasie O (n) i zwróć największy element k (dla dowolnej stałej k) w czasie O (n); Sortowanie bierze czas o (n lg n).

import heapq

n = int(input())
arr = [int(x) for x in input.split()]
heapq.heapify(arr)   # In-place; does not return the heapified list.
print(heapq.nlargest(2, arr)[-1])
1
chepner 4 czerwiec 2018, 14:20

Spójrz na Dokumentacja. Metoda list.remove to jeden, który modyfikuje listę In-Place . Oznacza to, że modyfikuje listę, o której nazywasz go, zamiast zwracać nową z żądaną zmianą.

Ponieważ ta funkcja nic nie zwraca, drukowanie l.remove() daje ci "brak". Aby wydrukować listę z usuniętym elementem, musisz trzymać się oryginalnego kodu.

5
jpp 4 czerwiec 2018, 14:17