Mam problem, który polega na: otrzymaniu krotki z obiektami dowolnego typu i podzieleniu jej na dwie krotki: pierwszą, tylko z ciągami; drugi, tylko z liczbami.Jak podzielić krotkę na dwie w pytonowy sposób
W porządku. Algorytm standardem byłoby coś jak:
def separate(input_tuple):
return_tuple = ([],[])
for value in input_tuple:
if isinstance(value, str):
return_tuple[0].append(value)
if isinstance(value, numbers.Number):
return_tuple[1].append(value)
return tuple([tuple(l) for l in return_tuple])
ten sposób możemy tylko iteracyjne raz.
Moje pytanie brzmi: czy istnieje sposób, aby zrobić to w bardziej pytony sposób? Jeden liniowiec?
Próbowałem
(tuple([i for i in input_tuple if isinstance(i,str)]), tuple([i for i in input_tuple if isinstance(i,numbers.Number)]))
Ale to jest mniej wydajny, jak iteracyjne nad krotki wejściowej dwukrotnie.
Również
tuple([ tuple([i for i in input_tuple if isinstance(i, k)]) for k in ((float ,int,complex), str) ])
ma ten sam problem, jak my dwie iteracje. Czy byłoby to możliwe do powtórzenia tylko raz i nadal uzyskać wynik, lub ponieważ mam do czynienia z rozdzieleniem na dwie krotki, nie jest to możliwe?
Dzięki!
Nie idź do "drogi pythonic", to pułapka, która nie służy niczemu i prawie zawsze redukuje raczej czytelny i łatwy do zrozumienia fragment kodu do bałaganu z 1-wierszowym kodem dekodera. Twoim celem powinien być kod sformatowany do formatu łatwego do utrzymania i czytania, a nie do jak najmniejszej liczby linii. –
@TymoteuszPaul Jestem tego świadomy. W rzeczywistości nie używam tego kodu, ale czuję się ograniczony, gdy myślę o zrozumieniu listy i ostatnio to badam; ludzie z przepełnienia stosu zawsze robią na mnie wrażenie swoimi odpowiedziami, dlatego właśnie zastanawiam się, czy to możliwe! Ale dzięki za radę! Przecież "Jawny jest lepszy niż niejawny"! – RafaelC
W języku Java z przyjemnością nazywamy to rozpraszaniem procesu! spliteratory ftw. – Shashank