Python: unikalne kombinacje z dwóch list (sztuczka start

9-gru-2020

Załóżmy, że mamy listę portów lotniczych i zastanawiamy się, jakie można zbudować trasy między nimi:

ports = ['WAW', 'KRK', 'GDN', 'KTW', 'WMI', 'WRO', 'POZ', 'RZE', 'SZZ',
 'LUZ', 'BZG', 'LCJ', 'SZY', 'IEG', 'RDO']
 
routes = [ (start, stop) for start in ports for stop in ports]
print(routes)
print(len(routes))

W routes zostanie wygenerowanych 255 tras, ale niestety znajdą się w niej zbędne wartości. Będzie trasa WAW-WAW,  ale znajdą się też duplikaty WAW-KRK oraz KRK-WAW. Jak je wykluczyć? Zmieniając wyrażenie generujące wartości dostaniemy już tylko 210 wyników, ale wyeliminowaliśmy tylko trasy z tego samego miasta do tego samego miasta:

routes = [ (start, stop) for start in ports for stop in ports if start != stop]
print(routes)
print(len(routes))

No to idźmy dalej. Polecenie w tej postaci da o wiele lepszy wynik – 105 tras:

routes = [ (start, stop) for start in ports for stop in ports if start < stop]
print(routes)
print(len(routes))

Zapis start<stop jest nieco dziwny. Porównujemy napisy: A<B, B<C, C<D itd.  Tak jak lista obecności w dzienniku szkolnym. Ten znak ostrej nierówności to „sztuczka programistyczna”.  Skoro A jest mniejsze od B, to nasz wzór wykryje tylko połączenie A do B, ale połączenie B do A pominie, bo B nie jest mniejsze od A.

Programowanie to nie tylko instrukcje i kod. Programowanie to też sztuczki, które sprawiają, że ten sam problem da się rozwiązać na kilka(set) różnych sposobów – a my musimy tylko wybrać ten lepszy z pewnego punktu widzenia!

Komentarze są wyłączone