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!