Existem alguns a, b tais que max (a, b)! = Max (b, a)? [fechadas]

11

No python 3.x, existem alguns a, bcomo esses max(a, b) != max(b, a)?

ae bdeve ser do tipo python interno e não contém nenhuma conversão.

O tipo de ae bpode ser: num, float, bool, list, tuple ...

Exemplo:

a = 1 # Correct
a = [1, 2] # Correct
a = float('nan') # Wrong

fonte
11
sua pergunta não está clara
seralouk 20/10/19
Eu não acho que exista ... maxé uma função interna que aceita um objeto iterável como entrada. Portanto, a,bé o mesmo que, b,aportanto, max(a,b)deve ser igualmax(b,a)
Anwarvic 20/10/19
11
Esta é uma boa pergunta, mas você deve editá-lo e explicá-lo mais
El.Hum
2
Sua edição só faz sentido no contexto do seu comentário abaixo da resposta mais votada. Aqui e aqui, você não consegue argumentar que float('nan')não é um tipo interno. Eu assumiria que "tipo interno" significaria qualquer coisa que você possa criar sem precisar criar um novo class.
Teepeemm
2
Se você deseja excluir float('nan'), por que? Para ser claro, você pode fazer uma pergunta na qual exclui algo como float('nan')se quiser; esse não é o problema. O problema é que ninguém sabe ao certo o que você está tentando perguntar.
Nat

Respostas:

17

Isso satisfaz todos os critérios:

>>> max(1.0, float("nan"))
1.0

>>> max(float("nan"), 1.0)
nan

Isso ocorre porque qualquer comparação que não seja != ou iscom float("nan")sempre retornar falso.

De maneira mais geral, podemos ter max(a, b) != max(b, a)quando o (s) tipo (s) de a, bnão fornece um pedido total. Como Daniel Mesejo aponta, os sets também têm essa propriedade. Para conjuntos <significa 'subconjunto estrito', mas com{1, 2} e {3, 4}nenhum é um subconjunto estrito do outro, portanto:

>>> max({1, 2}, {3, 4})
{1, 2}

>>> max({3, 4}, {1, 2})
{3, 4}

Tecnicamente, este não tem max(a, b) != max(b, a)porque 1 == True, mas ainda há uma diferença observável:

>>> max(True, 1)
True

>>> max(1, True)
1
orlp
fonte
11
WOW ... por que isso?
Anwarvic
7
@ stackFF4 se float("nan")não estiver embutido, o que é? Certamente está embutido.
sanyash
9
@ stackFF4: float('nan')é um flutuador. Está escrito floatali, então não tenho certeza do que mais você esperava que fosse. Você pode verificar typese quiser.
User2357112 suporta Monica
11
@ Anwarvic: Curiosamente, não é uma coisa de python, é como os carros alegóricos são implementados no hardware. NaN compara false com tudo em quase todas as linguagens de programação.
Mooing Duck
2
@ Nat: Mas ninguém quer exceções na maioria das vezes. Esse maxcomportamento é um artefato de defini-lo de maneira diferente de C fmax(que garante a propagação de NaN), em vez disso, como algo a<b ? b : aque sempre produz aquando a comparação é falsa. NaN é wrt "não ordenado". qualquer outro número, por isso a < NaNé sempre falsa, e assim éNaN < b
Peter Cordes
5

De acordo com a documentação , o uso maxde conjuntos produz resultados indefinidos:

Portanto, conjuntos não são argumentos apropriados para funções que dependem da ordem total (por exemplo, min (), max () e ordenados ()) produzem resultados indefinidos, dada uma lista de conjuntos como entradas).

Aqui está um exemplo,

a = {1, 2}
b = {2, 3}
print(max(b, a) != max(a, b))

Resultado

True
Dani Mesejo
fonte
Pode ser interessante notar aqui que "resultados indefinidos" provavelmente são mais saudáveis ​​no Python do que em outras línguas. Não é provável que haja demônios nasais , e provavelmente nem levantará uma exceção. Ele apenas retorna um valor principalmente arbitrário (para mine max) ou pedido (para sorted).
Blckknght