0
votes

Comment attribuer une valeur entière des bacs

J'essaie de trouver un moyen pythononique d'affecter une valeur numérique en fonction duquel une variable tombe dans. C'est: xxx pré>

i peut bien sûr créer une liste contenant les godets / valeurs et itérer et revenir lorsque la valeur correcte est trouvée: p> xxx pré>

mais je dois ensuite vérifier les limites inférieure et supérieure et l'égalité, c'est-à-dire si elle est la première itération de la boucle Je dois vérifier si inférieur (

Je cherche quelque chose comme ceci (Ruby): P>

buckets = [
[:<, -90, -57], 
[:<=, 5, -10], 
[:<=, 10, 3], 
[:>, 60, 40]] 

# Pass bucket to a method


13 commentaires

Je ne suis pas sûr de ce qu'est un bon titre de question pour ce problème. Toute suggestion est la bienvenue.


vérifier Cette réponse ... je ne le fais pas savoir si c'est ce que vous cherchez


Quel est le code que vous envisagez de la première place? Si vous pouviez ajouter celui-ci à la question w pourrait aider à le traduire en python.


@Anwarvic je ne cherche pas un si sinon. Parce que cela force la quantité de seaux.


@TobiaSwilfert à Ruby Je pourrais faire la même chose avec ceci: Seaux = [[[[: <, -90, -57], [: <=, 5, -10], [: <=, 10, 3], [:> , 60, 40]] puis transmettez-le à une méthode. Quelque chose de similaire dans Python?


Si vous écrivez EXACT RUBY Equivalent dans votre question, il est peut-être plus facile de trouver quelque chose similaire à Python, ce sont également vos nombres uniquement des entiers ou ils peuvent aussi être des flotteurs?


@unlut uniquement des entiers dans mon cas. J'ai édité ma question pour ajouter le seau de rubis.


Ceci s'appelle Binning et il existe de nombreuses solutions existantes. Pouvez-vous utiliser la bibliothèque pandas , il a pd.cut () ? Binning et transformation en Pandas


@smcii de ma compréhension PD.Cut () se séparera en bacs, mais je ne vois pas les limites supérieures inférieures, c'est-à-dire si je crée des bacs [0, 10, 20], il créera 2 bacs [0 - 10] et [10 -20] Mais rien pour dire [-inf - 0] ni [20 - INF]. Je vais regarder plus loin si je me trompe. Mais c'est le genre de réponse que je cherche!


@Jubonn: C'est généralement le cas des bacs distincts adjacents, d'où le sommet du bac (N-1) est le fond de la poubelle n. Mais vous voulez des bacs disjoints. Vous pouvez également inclure les bacs manquants, puis la carte illégale / des valeurs des bacs manquantes à ce que vous voulez. BTW, NP.Ninf, np.pinf sont des valeurs légales des bacs.


@smci c'est la réponse que je cherchais! Par conséquent, une combinaison de PD et NP.NINF / NP.INF.


Voulez-vous une solution de base python (en utilisant opérateur.ge/gt/lt/le ) ou une solution pandas + numpy (en utilisant pd.cut ), ou don ' T-Care qui? Voulez-vous que votre sortie soit la valeur inférieure de la corbeille contenant, ou une catégorique correspondant au nombre de la corbeille, ou si vous ne vous souciez pas qui?


@SMCI Vérifiez avec le reste du codeBase. Je ne veux pas ajouter trop de dépendances. Je pense que les deux sont des réponses valides à ma question.


3 Réponses :


0
votes

Je pense que c'est assez pythonique, mais je ne le recommande pas xxx

avis que 88 est la valeur par défaut.

edit

Vous pouvez créer une fonction basée sur le même concept que si ... autre ci-dessus. La fonction serait quelque chose comme ceci: xxx

Vous pouvez l'utiliser comme: xxx


2 commentaires

Je cherche un moyen avec des valeurs et des limites variables. Par conséquent, un si-autre ne fonctionne pas pour moi.


@Jubonn, j'ai édité ma réponse, j'espère que cela fonctionne pour vous :)



0
votes

Si je vous ai bien compris, chaque "godet", vous avez un intervalle. Pour vérifier si la valeur appartient à un intervalle, vous pouvez définir une fonction: xxx pre>

désormais simplement sur une liste d'intervalles pour trouver où la valeur appartient: P>

for interval in list_of_intervals:
    check_value(value, interval)


1 commentaires

Cela équivaut à la fonction PD.CUT () mentionnée par @SMCI. Et il n'inclut pas les limites inférieure et supérieure.



1
votes

C'est assez simple avec le module opérateur code>. Voici un exemple: xxx pré>

mais vous pouvez faire mieux, en définissant une structure plus générique: p> xxx pré>

tout Code> L'opérateur renvoie True IFF Toutes les conditions sont remplies. La différence clé entre godets code> et est que vous pouvez ajouter des conditions qui ne concernent pas les limites, par exemple la valeur DOIT être une paire: P>

>>> value_by_conditions = { 
... ((operator.lt, -100),): -15,
... ((operator.ge, -100), (operator.le, -5)): -4,
... ((operator.gt, -5), (operator.le, 5)): 18,
... ((operator.gt, 5),): 88,
... }
>>> next((v for cs, v in value_by_conditions.items() if match_conditions(23, cs)), None)
88
>>> next((v for cs, v in value_by_conditions.items() if match_conditions(-101, cs)), None)
-15
>>> next((v for cs, v in value_by_conditions.items() if match_conditions(-100, cs)), None)
-4


0 commentaires