[Python-ideas] Syntax for key-value iteration over mappings
Nick Coghlan
ncoghlan at gmail.com
Wed Jul 29 11:10:34 CEST 2015
On 29 July 2015 at 16:22, Pierre Quentel <pierre.quentel at gmail.com> wrote:
> If the proposal was accepted for "for k:v in iterable" then I suppose that
> "if k:v in iterable" would also be valid, meaning that for a dict, there is
> a pair (k, v) such that _dict[k] = v, and for a list that there is an index
> k such that _list[k] = v.
>
> for k:v in iterable:
> assert k:v in iterable
This actually made me think of the quirky signatures of the dict
constructor and dict.update, where it's possible to pass in either a
mapping *or* an iterable of two-tuples:
https://docs.python.org/3/library/stdtypes.html#dict.update
If we went with the assumption that this syntax, if added, used those
semantics, then you could reliably build (assuming hashable values) a
reverse lookup table as:
reverse_lookup = {v:k for k:v in data_source}
At the moment, you have to restrict your input to mappings specifically:
reverse_lookup = {v:k for k,v in data_source.items()}
Or an iterable of 2-tuples:
reverse_lookup = {v:k for k,v in data_source}
Or use duck-typing:
if hasattr(data_source, "items"):
data_source = data_source.items()
reverse_lookup = {v:k for k,v in data_source}
I'd still be -0 on such a proposal with dict.update iteration
semantics (as much as I think it's neat, I don't think the practical
benefit is there to justify it), but it does have the virtue of
extracting a particular iteration pattern from an existing builtin
type.
Regards,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
More information about the Python-ideas
mailing list