2017-10-16 8 views
0

Je dois trouver la valeur minimale d'une liste de valeurs, mais il est interdit d'utiliser une ou plusieurs bibliothèques intégrées. Je suis autorisé à utiliser si sinon ou elif mais c'est la mesure.Recherche du minimum et du maximum d'une liste de valeurs sans tri ni utilisation de fonctions ou de bibliothèques intégrées

Je dois utiliser des opérateurs de base et (je suppose?) Ma propre intuition pour comprendre cela.

Malheureusement, je ne suis pas si intuitive et quelle que soit la combinaison d'instructions if else que j'utilise ou <> opérateurs, je ne peux tout simplement pas le faire fonctionner.

Je suis vraiment novice en python et mon professeur n'a pas vraiment aidé à décrire comment s'y prendre pour faire ça (autre que de définir les opérateurs.) C'est littéralement tout ce qu'il a fait. Donc, fondamentalement, j'ai une liste de trois entiers et je dois trouver le min et max de ces trois nombres entiers (je dois trouver d'autres choses aussi, mais gardons cela simple). Je dois utiliser des fonctions pour définir les entiers et séparer les fonctions pour définir les min et max de la liste.

J'ai la fonction pour définir les entiers, qui était facile, maintenant je suis coincé sur ce point:

def determine_min_value(a,b,c): 
    print ("The minimum value is {}.".format(c < (b < a))) 

a, b, et c étant des variables (num1, num2, num3)

il affiche "La valeur minimale est False". ce qui serait génial si Faux était un très petit nombre, et aussi l'une des variables d'entrée; ce qui n'est évidemment pas le cas. Je suis pleinement conscient que .format (c < (b < a)) ne va pas me donner ce que je veux, mais c'était mon dernier effort dernier. Comme je l'ai dit, j'essayais d'autres déclarations, mais je ne pouvais pas les comprendre non plus. Je n'ai simplement aucune idée d'où aller et toute contribution serait grandement appréciée. Aussi, je sais que vous voulez dire "Il suffit de les mettre dans une liste et d'utiliser min (1)" mais encore une fois, je ne suis pas autorisé. Je n'aimerais rien de plus que de faire ça aussi.

+0

https://stackoverflow.com/questions/11964450/python-order-a-list-of-numbers-without-built-in-sort-min-max-function – narn

+1

Copie possible de [python: commander une liste de nombres sans tri intégré, min, max fonction] (https://stackoverflow.com/questions/11964450/python-order-a-list-of-numbers-without-built-in-sort-min-max- fonction) – narn

Répondre

0

EDIT: Puisque vous ne pouvez pas utiliser de réduire(), vous pouvez le faire en ligne pour trois entiers comme suit:

maximum = lambda x, y, z: x if x > (y and z) else y if y > z else z 
maximum(1, 5, 7) 

Si vous voulez vraiment pour éviter lambda pour l'amour d'un professeur, vous pouvez l'écrire traditionnellement:

def maximum (x, y, z): 
    if x > y and z: 
     return x 
    elif y > z: 
     return y 
    else: 
     return z 

pour étendre les fonctionnalités ci-dessus lorsque l'entrée très grande échelle serait mieux mis en œuvre l'utilisation d'une fonction intégrée appelée réduire (surtout si tu es essayer de faire autre chose que cocher max ou min, ce qui est évidemment une fonctionnalité intégrée).

from functools import reduce 

def check_greater(a,b): 
    if a > b: 
     return b 
    else: 
     return a 

number_list = [1,6,3,8,5,78,4,23,9] 

minimum = reduce(check_greater, number_list) 

Il en sera de la fonction check_greater() pour chaque paire d'éléments de la liste et renvoie continuellement une valeur pour chaque paire, correspondant à ce qui est inférieur.

Les premiers 1 et 6 seront comparés. Puisque 1 est inférieur, il sera retourné à la place de ces deux valeurs. Maintenant, 1 et 3 seront comparés. Encore une fois, puisqu'il est plus bas, il sera retourné pour remplacer ces deux valeurs. Peut-être que j'aurais dû imbriquer 1 quelque part au milieu pour le rendre plus évident, mais peu importe où la valeur minimale tombe dans la liste des nombres, la fonction de réduction prendra votre itérative entière et retournera une seule valeur basée sur la fonction que vous passez comme premier argument.

Notez que vous pouvez faire la même chose avec un maximum, il suffit de basculer a et b dans les instructions de retour de la fonction check_greater().

+0

Désolé, mais je ne suis pas autorisé à utiliser les bibliothèques intégrées ou fonctions et functools ainsi que la fonction de réduction enfreindre ces deux restrictions. J'apprécie que vous preniez le temps de m'aider à comprendre cela. Je tiens également à vous remercier d'avoir fait connaître cette fonctionnalité, car je n'aurais même pas pensé à cela, même si je pouvais utiliser des fonctions. –

+0

La réponse en haut est probablement le moins de lignes de code que vous pouvez utiliser. La deuxième fonction réduit quelques lignes de la solution gil.fernandes. Si vous avez besoin de faire quelque chose de complexe à un itérable, il est bon d'utiliser réduire, donc je suis parti – Hanzy

+0

@ Reti43 vous avez raison, j'aurais dû utiliser "et" au lieu de chaîner les opérateurs. J'ai fait une correction maintenant, merci! – Hanzy

0

Puisque vous mentionnez une liste de valeurs, vous pouvez le faire par récursion

import numpy as np 

def mymin(lst): 
    if not lst: 
     return np.inf 
    head = lst[0] 
    tail = mymin(lst[1:]) 
    return head if head < tail else tail 

Ce qu'il fait

  • le min de la liste est soit le premier élément, ou min du reste
  • la liste vide est ignorée (en ayant une valeur infinie)

Cependant, gardez à l'esprit que ce n'est pas efficace en python

+0

Je pense que l'idée n'est pas que ce soit efficace, mais plutôt que ça soit une douleur dans le cul. –

+1

@TristanStroud: OK, cet exemple est! –

+0

Ceci utilise une bibliothèque, ce qui est contraire aux exigences de l'OP. – Reti43

0

J'ai travaillé pendant un certain temps et a fini avec

# function determines and defines the minimum value 
def det_min_value(a,b,c): 
    print ("The minimum value is {}.".format(a if (a < b and c) 
               else b if (b < c and a) 
                else c)) 
    # for range function 
    return (a if (a < b and c) 
       else b if (b < c and a) 
        else c) 

fonctionne vraiment bien. Sans les informations fournies pour moi ici je n'aurais pas pu le faire, merci beaucoup à tous!