Ich habe ein Problem, das ist: ein Tupel mit Objekten aller Art zu erhalten, und trennen Sie es in zwei Tupel: das erste, nur mit Strings; die zweite, nur mit Zahlen.Wie teilt man ein Tupel in zwei in pythonischer Weise
In Ordnung. Der Standard-Algorithmus wäre so etwas wie:
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])
Auf diese Weise wir iterieren nur einmal.
Meine Frage ist: Gibt es einen Weg, es auf eine pythischere Weise zu tun? Ein Einliner?
Ich habe
versucht(tuple([i for i in input_tuple if isinstance(i,str)]), tuple([i for i in input_tuple if isinstance(i,numbers.Number)]))
Aber es ist weniger effizient, da wir zweimal über den Eingangstupel laufen. Auch
,
tuple([ tuple([i for i in input_tuple if isinstance(i, k)]) for k in ((float ,int,complex), str) ])
hat das gleiche Problem, wie wir zwei Iterationen tun. Wäre es möglich, nur einmal zu iterieren und trotzdem das Ergebnis zu erhalten, oder weil es sich um eine Trennung in zwei Tupel handelt, ist das nicht möglich?
Danke!
Gehen Sie nicht auf den "pythonischen Weg", es ist ein Fallstrick, der nichts nützt und fast immer ein ziemlich lesbares und leicht zu verstehendes Stück Code in ein 1-Zeilen-Decoder-Ring-Chaos verwandelt. Ihr Ziel sollte es sein, den Code in einem Format zu formatieren, das leicht zu pflegen und zu lesen ist und nicht so wenige Zeilen wie möglich zu haben. –
@TymoteuszPaul Ich bin mir dessen bewusst. Ich benutze diesen Code nicht wirklich, aber ich fühle mich eingeschränkt, wenn ich über Listenverstehen nachdenke, und ich habe das in letzter Zeit studiert; Leute vom Stapelüberlauf beeindrucken mich immer mit ihren Antworten, deshalb frage ich mich, ob das möglich ist! Aber danke für den Rat! Schließlich ist "Explizit ist besser als implizit"! – RafaelC
In Java nennen wir diese Prozessversplitterung liebevoll! spliterators ftw. – Shashank