Python Forum
Thread Rating:
  • 1 Vote(s) - 3 Average
  • 1
  • 2
  • 3
  • 4
  • 5
About the output format.
#1
I'm a newer to python, just have some simple format questions. Here is my code of creating a new function.

[python] >>> def make_complex(x,y):
... return{'y':y,'x':x}
>>> make_complex(4,2)
{'y': 2, 'x': 4}
[python]

and the second version is like this:

[python] >>> def make_complex(x,y):
... return{'x':x,'y':y,}
>>> make_complex(4,2)
{'y': 2, 'x': 4}
[python]

I found out that for the return part, I won't get the real order of what I define in the function. It turns out 'y' always be the first one to show up. Could anyone clear my confusion? Thanks.
Reply
#2
Dictionary keys are hashed, so they are in "hashed" order, not input order. Use an OrderedDict if you want keys in original order. The latest version of Python uses an OrderedDict by default so it also depends on which version of Python you have installed.
Reply
#3
(Jan-10-2019, 06:03 AM)woooee Wrote: Dictionary keys are hashed, so they are in "hashed" order, not input order.

Your statement suggest there is some kind of order that is preserved, even if it is not the order of insertion. That's not true for python version before 3.6. There is no guarantee that any order will be preserved between different runs of the same script, i.e. if you run the same script multiple times you may get different order. This is more easy to observe with larger dicts. In python 3.6. order of insertion is preserved, but it is considered implementation detail and should no be relied upon. As of 3.7. order of insertion preservation feature is part of official python API. However is not correct to say that
(Jan-10-2019, 06:03 AM)woooee Wrote: the latest version of Python uses an OrderedDict by default
.
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#4
(Jan-10-2019, 07:23 AM)buran Wrote:
(Jan-10-2019, 06:03 AM)woooee Wrote: Dictionary keys are hashed, so they are in "hashed" order, not input order.

Your statement suggest there is some kind of order that is preserved, even if it is not the order of insertion. That's not true for python version before 3.6. There is no guarantee that any order will be preserved between different runs of the same script, i.e. if you run the same script multiple times you may get different order. This is more easy to observe with larger dicts. In python 3.6. order of insertion is preserved, but it is considered implementation detail and should no be relied upon. As of 3.7. order of insertion preservation feature is part of official python API. However is not correct to say that
(Jan-10-2019, 06:03 AM)woooee Wrote: the latest version of Python uses an OrderedDict by default
.
So, is that means, actually, the order is not preserved by different python version and there is no good reason to explain the order of the output as you state that you may get different order running the same script?
Reply
#5
(Jan-10-2019, 06:01 PM)shang2019 Wrote: So, is that means, actually, the order is not preserved by different python version and there is no good reason to explain the order of the output as you state that you may get different order running the same script?

from the docs


Quote:Note

By default, the __hash__() values of str, bytes and datetime objects are “salted” with an unpredictable random value. Although they remain constant within an individual Python process, they are not predictable between repeated invocations of Python.

This is intended to provide protection against a denial-of-service caused by carefully-chosen inputs that exploit the worst case performance of a dict insertion, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details.

Changing hash values affects the iteration order of sets. Python has never made guarantees about this ordering (and it typically varies between 32-bit and 64-bit builds).

See also PYTHONHASHSEED.

Also, check that SO answer
https://stackoverflow.com/a/15479974/4046632

Quote:Note that as of Python 3.3, a random hash seed is used as well, making hash collisions unpredictable to prevent certain types of denial of service (where an attacker renders a Python server unresponsive by causing mass hash collisions). This means that the order of a given dictionary is then also dependent on the random hash seed for the current Python invocation.

That's a result from a change in python 3.3 that hash randomization is switched on by default as a security feature. If you want more info on hash randomization check https://stackoverflow.com/a/27522708/4046632


As already stated - as of 3.7 Insertion order preservation is part of the API.
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  format the output from a nested dictionary. nostradamus64 9 4,423 May-03-2021, 04:45 PM
Last Post: nostradamus64
  JupyterLab Dictionary Content Output Format Ourkid123uk 0 1,278 Sep-04-2020, 02:18 PM
Last Post: Ourkid123uk
  Format SQL Query Output phillyfa 2 3,956 Apr-22-2020, 07:45 AM
Last Post: buran
  Save output into a Excel Sheet with Format Table skaailet 1 2,455 Apr-17-2020, 11:56 PM
Last Post: thirteendec
  Display output in readable format and save hnkrish 1 2,586 Jul-19-2019, 09:29 AM
Last Post: Larz60+
  python script to get wildcard mask output in the following format techrichit 0 3,777 Aug-10-2018, 11:01 PM
Last Post: techrichit

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020