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?
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 exceptionTypeError
lorsque les opérandes n'ont pas un ordre naturel significatif. Ainsi, des expressions comme1 < ''
,0 > None
oulen <= len
ne sont plus valides, et par exempleNone < None
soulèveTypeError
au lieu de retournerFalse
. 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.
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
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
>>>
il compare les listes elementwise:
>>> [1,2]<[1,3]
True
>>> [1,2]<[1,2,21]
True
>>>