To jest pytanie z poradami do gry w golfa w pythonie .
Załóżmy, że masz dwie listy ciągów i chcesz połączyć odpowiednie wpisy z każdej listy. Np. Za pomocą a=list("abcd")
i b=list("1234")
, oblicz ["a1","b2","c3","d4"]
.
Jest to trywialne w językach programowania opartych na macierzach, w których operacje zwykle dotyczą członków list. Na przykład w moim języku golfowym Pip kod jest po prostu a.b
. Ale w Pythonie nie jest to takie proste.
Pythonicznym sposobem jest prawdopodobnie użycie zip
i odczytanie listy (25 znaków):
[x+y for x,y in zip(a,b)]
Inną metodą jest map
funkcja lambda (23):
map(lambda x,y:x+y,a,b)
Oto najkrótszy, jaki wymyśliłem (21):
map("".join,zip(a,b))
Czy jest jakaś krótsza metoda?
Załóżmy, że listy mają tę samą długość i że potrzebny jest jakiś rodzaj iterowalności (więc map
w Pythonie 3 obiekt jest w porządku).
Odpowiedzi:
20 znaków
Używa wbudowanej metody dodawania ciągów znaków,
__add__
która jest wywoływana przez+
ciągi zamiast funkcji anonimowejlambda x,y:x+y
.źródło
str.__add__
ale z jakiegoś powodu nie sprawdziłem, czy jest krótszy.map
wielu iteracji, które automatycznie wyłączają kompresowanie. Bez tego nie byłby krótszy. Pamiętaj, że jeśli w kodzie musisz uzyskać dostęp do niektórych__*__
metod, może być to krótsze,from operator import *
a następnie skorzystaj z nichmap(add,a,b)
.