Python`dict`按元组索引:分一杯羹

Python`dict`按元组索引:分一杯羹,python,dictionary,indexing,tuples,Python,Dictionary,Indexing,Tuples,假设我有 my_dict = { ("airport", "London"): "Heathrow", ("airport", "Tokyo"): "Narita", ("hipsters", "London"): "Soho" } 什么是一种高效(无需扫描所有键)但又优雅的方法,可以从本词典中获取所有机场,即预期输出[“希思罗机场”、“成田机场”]。在可以按元组索引的数据库中,通常可以执行以下操作 airports = my_dict.get(("airport",*)) (但

假设我有

my_dict = {
  ("airport", "London"): "Heathrow",
  ("airport", "Tokyo"): "Narita",
  ("hipsters", "London"): "Soho"
}
什么是一种高效(无需扫描所有键)但又优雅的方法,可以从本词典中获取所有机场,即预期输出
[“希思罗机场”、“成田机场”]
。在可以按元组索引的数据库中,通常可以执行以下操作

airports = my_dict.get(("airport",*))
(但通常只有“星”位于元组中最右边的位置,因为索引通常只按一个顺序存储)

由于我想象Python以类似的方式(使用键的固有顺序)为具有元组键的字典编制索引,所以我想象可能有一种方法可以用于以这种方式分割索引

Edit1:添加了预期输出

编辑2:删除了最后一句话。在条件中添加了“(不扫描所有键)”以使其更清晰

如果可能的话,我想避免的是检查所有字典键并过滤它们

为什么??为什么你认为Python做的是DB全表扫描?筛选字典并不意味着按顺序扫描它

Python:

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

['Narita', 'Heathrow']
检查字典中的每个键中是否有“airport”

演示

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

是的,嵌套字典将是更好的选择

>>> 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']
>>> 

数据当前的组织方式不允许高效的查找—实际上,您必须扫描所有键

字典是幕后的散列表,访问值的唯一方法是获取键的散列-为此,您需要整个键

使用这样的嵌套层次结构,以便可以直接执行O(1)查找:


您的预期输出是什么。你也能贴出来吗。你的问题有点让人困惑。使用字典。输入有多大?@Karoly Horvath:你的意思是像
my_dict={“airport”:{“London”:“Heathrow”,“Tokyo”:“Narita”}
?是的,那总是有效的。我想知道是否有一种方法可以有效地利用元组索引。@KarolyHorvath:谢谢。在这种情况下,这里的正确答案是IMO“在python中使用建议的数据结构没有有效的方法来执行此操作-如果对所有键进行顺序扫描太慢,则需要切换到dict of dict”。请随意按照这些思路创建一个答案,我会接受的。谢谢<代码>筛选字典并不意味着按顺序扫描它。您能详细介绍一下吗?我很好奇,如果不是通过完全扫描,python是如何实现这一点的。如果我只过滤密钥的第一部分,它会自动优化吗?如果我做
[键的值,我的dict.items中的值(),如果键[1]==“Tokyo”]
,那会导致顺序扫描吗?@MichelMüller:检查
如果键中的“Tokyo”
“顺序扫描”,这就是你的代码所做的。这里的评论基本上是一样的——这不是在对所有键进行顺序扫描吗?@MichelMüller:我想不是。在注释中标注尺寸时创建字典的字典。
my_dict = {
  "airport": {
     "London": "Heathrow",
     "Tokyo": "Narita",
  },
  "hipsters": {
     "London": "Soho"
  }
}