Comment fonctionne la fonction min / max sur une liste imbriquée?

disons, il y a une liste imbriquée, comme:

my_list = [[1, 2, 21], [1, 3], [1, 2]]

quand la fonction min() est appelée sur ceci:

min(my_list)

la sortie reçue est

[1, 2]

pourquoi et comment ça marche? Quels sont certains des cas d'utilisation de celui-ci?

23
demandé sur Bhargav Rao 2015-12-02 21:17:45

4 réponses

comment les listes et autres séquences sont-elles comparées en Python?

listes (et autres séquences) en Python sont comparées lexicographiquement et non basées sur un autre paramètre.

les objets séquentiels peuvent être comparés à d'autres objets ayant le même type de séquence. La comparaison utilise lexicographique ordre: les deux premiers éléments sont comparés, et s'ils diffèrent, cela détermine le résultat de la comparaison; s'ils sont égaux, les deux suivants sont comparés, et ainsi de suite, jusqu'à ce que l'une ou l'autre séquence soit épuisée.


qu'est-ce que le tri lexicographique?

de la page Wikipedia sur le tri lexicographique

ordre lexicographique ou lexicographique (également appelé ordre lexical, ordre du dictionnaire, ordre alphabétique ou produit lexicographique(al)) est une généralisation de la façon dont l'ordre alphabétique des mots est basé sur l'ordre alphabétique de leurs lettres composantes.

la fonction min renvoie la plus petite valeur de la fonction itérable . Ainsi, la valeur lexicographique de [1,2] est moins dans cette liste. Vous pouvez vérifier en utilisant [1,2,21]

>>> my_list=[[1,2,21],[1,3],[1,2]]
>>> min(my_list)
[1, 2]

que se passe-t-il dans ce cas de min ?

Va élément sage sur my_list , d'abord [1,2,21] et [1,3] . Extrait du docs

si deux éléments à comparer sont eux-mêmes séquences de la même type , la comparaison lexicographique est effectuée récursivement ".

Ainsi la valeur de [1,1,21] est inférieur à [1,3] , parce que le deuxième élément de [1,3] , qui est, 3 est lexicographiquement plus que la valeur du deuxième élément de [1,1,21] , qui est, 1 .

Maintenant, en comparant [1,2] et [1,2,21] , et en ajoutant une autre référence du docs

si une séquence est une sous-séquence initiale de l'autre, la séquence plus courte est la plus petite 1519650920" (plus petite).

[1,2] est une sous-séquence initiale de [1,2,21] . Par conséquent, la valeur de [1,2] sur l'ensemble est plus petit que celui de [1,2,21] . Par conséquent [1,2] est retourné comme la sortie.

ceci peut être validé en utilisant la sorted fonction

>>> sorted(my_list)
[[1, 2], [1, 2, 21], [1, 3]]

que se passe-t-il si la liste comporte plusieurs éléments minimums?

si la liste contient des éléments doubles min le premier est retourné

>>> my_list=[[1,2],[1,2]]
>>> min(my_list)
[1, 2]

cela peut être confirmé en utilisant la fonction id appel de fonction

>>> my_list=[[1,2],[1,2]]
>>> [id(i) for i in my_list]
[140297364849368, 140297364850160]
>>> id(min(my_list))
140297364849368

Que dois-je faire pour empêcher la comparaison lexicographique dans min ?

si la comparaison requise est Non lexicographique alors l'argument key peut être utilisé (comme mentionné par Padraic )

la fonction min a un argument optionnel supplémentaire appelé key . L'argument key prend une fonction.

l'argument clé optionnel spécifie une fonction de commande à un seul argument comme pour list.sort() . L'argument clé, s'il est fourni, doit être sous forme de mots-clés (par exemple, min(a,b,c,key=func) ).

par exemple, si nous avons besoin de plus petit élément par longueur, nous devons utiliser la fonction len ".

>>> my_list=[[1,2,21],[1,3],[1,2]]
>>> min(my_list,key=len)            # Notice the key argument
[1, 3]

comme nous pouvons voir le premier élément le plus court est retourné ici.


et si la liste est hétérogène?

Jusqu'À Python2

Si la liste est hétérogène noms de type sont pris en considération pour la commande, cocher comparaisons ,

les objets de différents types sauf les nombres sont ordonnés par leurs noms de type

donc si vous mettez un int et un list là vous obtiendrez la valeur entière comme le plus petit comme i est d'une valeur inférieure à l . De même, '1' aurait une valeur plus élevée que les deux.

>>> my_list=[[1,1,21],1,'1']
>>> min(my_list)
1

Python3 et suivants

cependant cette technique confuse a été supprimée dans Python3 . Il soulève maintenant un TypeError . Lire Quoi de neuf en Python 3.0

les opérateurs de comparaison de commandes( < , <= , >= , > ) soulever une exception TypeError lorsque les opérandes n'ont pas un ordre naturel significatif. Ainsi, des expressions comme 1 < '' , 0 > None ou len <= len ne sont plus valides, et par exemple None < None soulève TypeError au lieu de retourner False . Un corollaire est que trier une liste hétérogène n'a plus de sens – tous les éléments doivent être comparables entre eux .

>>> my_list=[[1,1,21],1,'1']
>>> min(my_list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < list()

mais il travaille pour types comparables , par exemple

>>> my_list=[1,2.0]
>>> min(my_list)
1

Ici, nous pouvons voir que le list contient float valeurs " et int valeurs". Mais comme float et int sont des types comparables, min fonction fonctionne dans ce cas.

37
répondu Bhargav Rao 2017-05-23 12:26:06

un cas d'utilisation simple pour le tri lexicographique est de faire une classe namedtuple ".

from collections import namedtuple
Time = namedtuple('Time', ['hours', 'minutes', 'seconds'])

t1 = Time(hours=8, minutes=15, seconds=30)
t2 = Time(hours=8, minutes=15, seconds=0)
t3 = Time(hours=8, minutes=30, seconds=30)
t4 = Time(hours=7, minutes=15, seconds=30)

assert min(t1, t2, t3, t4) == t4
assert max(t1, t2, t3, t4) == t3
5
répondu 김민준 2015-12-13 07:37:31

deux listes sont comparées element wise

même si les tailles de deux listes sont différentes les deux listes sont comparées par élément à partir de la comparaison du premier élément.

Maintenant, supposons que chaque élément d'une liste a été vérifiée et qu'ils sont les mêmes et il n'y a aucun élément suivant dans la liste plus courte. Ensuite, la liste plus courte est déclaré être plus petite que la plus longue.

exemples:

>>> [1,2]<[1,3]
True
>>> [1,2]<[1,2,21]
True
>>> [1,3]<[1,2,21]
False
>>>[1,2,22]<[1,2,21]
False
>>>[1]<[1,2,21]
True
>>>
2
répondu Tejesh Raut 2015-12-13 14:47:54

il compare les listes elementwise:

>>> [1,2]<[1,3]
True
>>> [1,2]<[1,2,21]
True
>>> 
1
répondu Paweł Kordowski 2015-12-02 18:19:40