Python `dict` indexed by tuple: Getting a slice of the pie

江枫思渺然 提交于 2019-12-04 04:39:55

问题


Let's say I have

my_dict = {
  ("airport", "London"): "Heathrow",
  ("airport", "Tokyo"): "Narita",
  ("hipsters", "London"): "Soho"
}

What is an efficient (no scanning of all keys), yet elegant way to get all airports out of this dictionary, i.e. expected output ["Heathrow", "Narita"]. In databases that can index by tuples, it's usually possible to do something like

airports = my_dict.get(("airport",*))

(but usually only with the 'stars' sitting at the rightmost places in the tuple since the index usually is only stored in one order).

Since I imagine Python to index dictionary with tuple keys in a similar way (using the keys's inherent order), I imagine there might be a method I could use to slice the index this way?

Edit1: Added expected output

Edit2: Removed last phrase. Added '(no scanning of all keys)' to the conditions to make it clearer.


回答1:


The way your data is currently organized doesn't allow efficient lookup - essentially you have to scan all the keys.

Dictionaries are hash tables behind the scenes, and the only way to access a value is to get the hash of the key - and for that, you need the whole key.

Use a nested hierarchy like this, so you can do a direct O(1) lookup:

my_dict = {
  "airport": {
     "London": "Heathrow",
     "Tokyo": "Narita",
  },
  "hipsters": {
     "London": "Soho"
  }
}



回答2:


Check "airport" is present in the every key in the dictionary.

Demo:

>>> [value for  key, value in my_dict.items() if  "airport" in key]
['Narita', 'Heathrow']
>>> 

Yes, Nested dictionary will be better option.

>>> my_dict = {
...   "airport": {
...      "London": "Heathrow",
...      "Tokyo": "Narita",
...   },
...   "hipsters": {
...      "London": "Soho"
...   }
... }
>>> 
>>> if "airport" in my_dict:
...      result = my_dict["airport"].values()
... else:
...      result = []
... 
>>> print result
['Heathrow', 'Narita']
>>> 



回答3:


What I'd like to avoid, if possible, is to go through all dictionary keys and filter them down.

Why? Why do you think Python is doing the equivalent of a DB full table scan? Filtering a dictionary does not mean sequential scanning it.

Python:

[value for  key, value in my_dict.items() if key[0] == "airport"]

Output:

['Narita', 'Heathrow']


来源:https://stackoverflow.com/questions/30636279/python-dict-indexed-by-tuple-getting-a-slice-of-the-pie

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!