10 votes

diviser élégamment une liste (ou un dict) en deux via une fonction arbitraire en python

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

1voto

hanung Points 358

OK, c'est à propos des vaches :)

cows = {'a': 123, 'b': 90, 'c': 123, 'd': 70}

select = lambda cows, accept: {name: weight for name, weight
                               in cows.items()
                               if accept(weight)}

thin = select(cows, lambda x: x < 100)
fat  = select(cows, lambda x: x > 100)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X