J'essaie de trouver un moyen pythononique d'affecter une valeur numérique en fonction duquel une variable tombe dans. C'est: 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> 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
3 Réponses :
Je pense que c'est assez pythonique, mais je ne le recommande pas avis que Vous pouvez créer une fonction basée sur le même concept que Vous pouvez l'utiliser comme: p> 88 code> est la valeur par défaut. p>
edit forte> h2>
si ... autre code> ci-dessus. La fonction serait quelque chose comme ceci: p>
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 :)
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: 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)
Cela équivaut à la fonction PD.CUT () mentionnée par @SMCI. Et il n'inclut pas les limites inférieure et supérieure.
C'est assez simple avec le module mais vous pouvez faire mieux, en définissant une structure plus générique: p> opérateur code>. Voici un exemple:
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
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 B> et il existe de nombreuses solutions existantes. Pouvez-vous utiliser la bibliothèque
pandas code>, il a
pd.cut () code>? 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 code>) ou une solution pandas + numpy (en utilisant
pd.cut code>), 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.