Existe-t-il un moyen élégant de diviser une liste/dict en deux listes/dicts en python, en utilisant une fonction de division arbitraire ?
Je pourrais facilement avoir deux compréhensions de liste, ou deux sélections, mais il me semble qu'il devrait y avoir un meilleur moyen de le faire qui évite d'itérer deux fois sur chaque élément.
Je pourrais le faire facilement avec une boucle for et une instruction if, mais cela nécessite environ 7 lignes de code pour une opération qui devrait être très simple.
Des idées ?
Edit :
À titre indicatif, mes deux solutions seraient les suivantes,
# given dict cows, mapping cow names to weight
# fast solution
fatcows = {}
thincows = {}
for name, weight in cows:
if weight < 100:
thincows[name] = weight
else:
fatcows[name] = weight
# double-list-comprehension solution would be
fatcows = {name: weight for name, weight in cows.items() if weight > 100}
thincows = {name: weight for name, weight in cows.items() if weight < 100}
Je me disais qu'il devait y avoir quelque chose de plus élégant que ça, auquel je n'ai jamais pensé, quelque chose comme :
thincows, fatcows = ??? short expression involving cows ???
Je sais qu'il est possible de le faire en écrivant des fonctions d'ordre supérieur pour le faire à ma place, et je sais comment le faire manuellement. Je me demandais simplement s'il existait une fonction de langage super élégante pour le faire à ma place.
C'est comme si vous pouviez écrire vos propres sous-routines et autres pour faire un SELECT sur une liste, ou vous pouvez simplement dire
thincows = select(cows, lambda c: c.weight < 100)
J'espérais qu'il y aurait un moyen tout aussi élégant de fendant la liste, en un seul passage