Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Python - posunuté hodnoty v setu

Ahoj,

Náhodou jsem narazil na nějakou chybu, kdy jsou v setu po vygenerování posunuté hodnoty - viz níže. Kde je chyba?


print([x for x in range(1,4)])  # [1, 2, 3]
print({x for x in range(1,4)})  # {1, 2, 3}

print([x for x in range(1,5)])  # [1, 2, 3, 4]
print({x for x in range(1,5)})  # {1, 2, 3, 4}

print([x for x in range(1,6)])  # [1, 2, 3, 4, 5]
print({x for x in range(1,6)})  # {1, 2, 3, 4, 5}

print("---")

print([2*x for x in range(1,4)])  # [2, 4, 6]
print({2*x for x in range(1,4)})  # {2, 4, 6}

print([2*x for x in range(1,5)])  # [2, 4, 6, 8]
print({2*x for x in range(1,5)})  # {8, 2, 4, 6} - ???

print([2*x for x in range(1,6)])  # [2, 4, 6, 8, 10]
print({2*x for x in range(1,6)})  # {2, 4, 6, 8, 10}

print("---")

print([3*x for x in range(1,4)])  # [3, 6, 9]
print({3*x for x in range(1,4)})  # {9, 3, 6} - ???

print([3*x for x in range(1,5)])  # [3, 6, 9, 12]
print({3*x for x in range(1,5)})  # {9, 3, 12, 6} - ???

print([3*x for x in range(1,6)])  # [3, 6, 9, 12, 15]
print({3*x for x in range(1,6)})  # {3, 6, 9, 12, 15}

Díky.

Předmět Autor Datum
Proč tam vůbec rveš ty kučeravé zátvorky? [89455-py-png]
karel 19.03.2020 03:43
karel
>>> print({2*x for x in range(1,5)}) set([8, 2, 4, 6]) https://docs.python.org/3/library/stdtypes…
Henonee 19.03.2020 04:09
Henonee
S pythonem teprve začínám, takže si zkouším různé věci. Narazil jsem právě na jeden příklad, kdy se…
Phpp 20.03.2020 01:02
Phpp
To není posunuté, ale neuspořádané :) Ještě objevíš věcí, třeba print (0.1 + 0.1) print (0.1 + 0.1…
karel 20.03.2020 01:19
karel
Hustý! Je pro to nějaké jednoduché vysvětlení, proč ten prostřední není 0.3? :)
Phpp 20.03.2020 02:47
Phpp
Nepřesná aritmetika pro desetinná čísla. Moc nad tím nepřemýšlej, nebo se z toho zblázníš :)
karel 20.03.2020 03:00
karel
jednoduse - pocitac to uklada binarne, s nejakou presnosti. Nektera desetina cisla nemaji rozumny za…
Henonee 20.03.2020 07:58
Henonee
Tady je o tom taky nějaké povídání.
karel 20.03.2020 10:12
karel
Zajímavé, díky oběma za odpovědi. :) poslední
Phpp 20.03.2020 13:05
Phpp
>>> print({2*x for x in range(1,5)}) set([8, 2, 4, 6]) # je tam 2, 4, 6, 8 .. nic nechybí => OK h…
Henonee 20.03.2020 02:01
Henonee

S pythonem teprve začínám, takže si zkouším různé věci. Narazil jsem právě na jeden příklad, kdy se to vypsalo posunuté o jeden item a já netuším, proč se to tak děje, tak jsem to zkusil ještě s pár hodnotama a zaujalo mě, že se to někdy vypíše postupně a někdy posunutě.
To právě nechápu - proč se to děje jen někdy?

print({2*x for x in range(1,4)}) # {2, 4, 6} - ok!
print({2*x for x in range(1,5)}) # {8, 2, 4, 6} - posunuté!
print({2*x for x in range(1,6)}) # {2, 4, 6, 8, 10} - ok!

Díky.

jednoduse - pocitac to uklada binarne, s nejakou presnosti. Nektera desetina cisla nemaji rozumny zapis v binarni soustave, nebo se blbe zaokrouhluji a tim dojde k nepresnostem.
0.1 = 1/10 (dekadicky)

pokud bychom meli dekadickou kalkulacku na 4 desetina mista, tak
1/3 = 0.3333

1/3+1/3+1/3 = 0.3333 + 0.3333 + 0.3333 = 0.9999 != 1

Zpět do poradny Odpovědět na původní otázku Nahoru