6 ms·
>>> list(dict.fromkeys([3, 2, 1])) [3, 2, 1] >>> list(set([3, 2, 1])) [1, 2, 3]
by pizzaburek 8y ago
>>> list(dict.fromkeys([3, 2, 1]))
[3, 2, 1]
>>> list(set([3, 2, 1]))
[1, 2, 3]
- carlmr 8y agoVery cool!
- misterdoubt 8y agoNeither dict nor set preserve order. This is a misleading snippet.
- woadwarrior01 8y agoIn Python 3.6+, dictionaries preserve insertion order. This is done by storing the keys, values (and cached hash values) in a separate array, and the hashtable is a succinct array of indexes into this array. This results in more compact dictionaries, which are also a bit faster because of it's cache friendliness. Preserving insertion order is a happy side effect of this. This optimization can also be applied to Python sets, but it hasn't been done yet.
- BerislavLopac 8y agoMore importantly, in Python 3.7 this exception has become the rule, i.e. it was introduced in the language specification
- dbcurtis 8y agoI am personally not a fan of details like this creeping into the language spec. CPython is not the only Python. This kind of spec creates unnecessary challenges for Micropython, for example. And of course there is Cython and others. It makes no sense to me that this should be in the language spec — you are essentially specifying a built in minefield of implementation bugs.
- joshuamorton 8y agoCpython took this implementation detail from pypy (so it was already going to be the case in the two most used python implementations). The reason being that the ordered dict ends up being faster than non-ordered, and people will rely on this implementation detail, so they added it to the spec to make that okay.
- misterdoubt 8y agoWell I'll be dipped.
- StreakyCobra 8y agoI think this behavior will only be working starting from Python 3.6, as the dictionary obtained by calling `dict.fromkeys()` before this would not keep the ordering [1] [1] https://youtu.be/p33CVV29OG8?t=489 https://youtu.be/p33CVV29OG8?t=489
- bhrgunatha 8y agoI love that talk. Raymond Hettinger is a gem. What I took from that is the implementation does preserve order but it isn't guaranteed yet and in theory it could change.
- StreakyCobra 8y ago> I love that talk. Raymond Hettinger is a gem. This talk is definitely worth a watch yes :) > What I took from that is the implementation does preserve order but it isn't guaranteed yet and in theory it could change. This was the case for python 3.6, but starting from Python 3.7 ordering is guaranteed [1]: Changed in version 3.7: Dictionary order is guaranteed to be insertion order. [1] https://docs.python.org/3.7/library/stdtypes.html#dict-views https://docs.python.org/3.7/library/stdtypes.html#dict-views
- teddyh 8y ago> Raymond Hettinger is a gem. His talks are good, except that every time he asks a stupid rhetorical question of the audience I’m overwhelmed with the urge to wang¹ a tomato at him. 1. https://www.gunnerkrigg.com/?p=330 https://www.gunnerkrigg.com/?p=330
- omegote 8y agoI'm not sure what you're trying to imply. If it's regarding the order, you're wrong. The keys returned by either `keys()` or by `__iter__` are returned in arbitrary order [1]. [1] https://docs.python.org/2/tutorial/datastructures.html#dictionaries https://docs.python.org/2/tutorial/datastructures.html#dicti...
- pizzaburek 8y agoThe whole cheatsheet is clearly in Python 3, where the same doc page that you linked states: Performing list(d) on a dictionary returns a list of all the keys used in the dictionary, in insertion order ...
- detaro 8y agoonly specified as such since Python 3.7, which hadn't been released when this cheat sheet was written, at least if the date at the top is accurate. EDIT: clicking through to GitHub, the date is clearly not up-to-date, so this might have been added later.
- coldtea 8y agoDictionaries should not be assumed to keep their orderings anyway. That's why there's OrderredDict. Unless the language explicitly says that dicts hold their order, even if they do, it's an implementation detail, and it should not be relied upon.
- snicker7 8y agoAs of 3.7 (3.6 for cpython), dictionaries have a deterministic order.
- thro_away_n 8y agoWhat's the best way to write code that relies on this deterministic order and prevent it from running incorrectly with older python versions?
- b_tterc_p 8y agoImport collections.OrderedDict as you would have done beforehand. There are still some differences between them. (Dicts in 3.7 and ordered dicts) https://stackoverflow.com/questions/50872498/will-ordereddict-become-redundant-in-python-3-7 https://stackoverflow.com/questions/50872498/will-ordereddic...
- BerislavLopac 8y agoIf "the language explicitly says" something, then it's part of the specification and not an implementation detail.
- coldtea 8y agoSure, hence the "unless" I've used.