繁体   English   中英

Python:按键选择字典项

[英]Python: select dictionary items by key

我有这本字典:

a = { 
    'car1': ('high cp', 'low fd', 'safe'),
    'car2': ('med cp', 'med fd', 'safe'), 
    'car3': ('low cp', 'high fd', 'safe'), 
    'taxi1': ('high cp', 'low fd', 'safe', 'med wt'), 
    'taxi2': ('high cp', 'low fd', 'safe', 'high wt'), 
    'taxi3': ('high cp', 'low fd', 'safe', 'high wt')
}

从以上字典中,我想创建一个仅包含“ car%s”的新字典

我正在使用此代码段 (来自另一个问题)

b = {}
for key in a:
    if key == 'car%s'% (range (4)):
        print (" %s : %s" % (key, a[key]))
print(b)

它返回{}

我希望得到:

a = { 
    'car1': ('high cp', 'low fd', 'safe'),
    'car2': ('med cp', 'med fd', 'safe'), 
    'car3': ('low cp', 'high fd', 'safe'), 
}

我在这里想念什么?

如果要添加其中包含单词car键,则它将起作用:

a = { 
    'car1': ('high cp', 'low fd', 'safe'),
    'car2': ('med cp', 'med fd', 'safe'), 
    'car3': ('low cp', 'high fd', 'safe'), 
    'taxi1': ('high cp', 'low fd', 'safe', 'med wt'), 
    'taxi2': ('high cp', 'low fd', 'safe', 'high wt'), 
    'taxi3': ('high cp', 'low fd', 'safe', 'high wt')
}

b = {}
for key in a:
    if 'car' in key:
        print (key, a[key])
        b[key] = a[key]
print(b)

您正在以错误的方式检查前缀,并且没有存储结果。 您可以使用str.startswith和dict comprehension生成结果:

>>> a = { 
... 'car1': ('high cp', 'low fd', 'safe'),
... 'car2': ('med cp', 'med fd', 'safe'), 
... 'car3': ('low cp', 'high fd', 'safe'), 
... 'taxi1': ('high cp', 'low fd', 'safe', 'med wt'), 
... 'taxi2': ('high cp', 'low fd', 'safe', 'high wt'), 
... 'taxi3': ('high cp', 'low fd', 'safe', 'high wt')
... }
>>> res = {k: v for k, v in a.items() if k.startswith('car')}
>>> res
{'car2': ('med cp', 'med fd', 'safe'), 'car3': ('low cp', 'high fd', 'safe'), 'car1': ('high cp', 'low fd', 'safe')}

当前的检查不是在格式字符串中插入数字,而是在其中插入range对象,这可能不是您期望的结果:

>>> 'car%s'% (range (4))
'carrange(0, 4)'

您永远不会对已验证的密钥进行任何操作,而是print它们。 您需要将它们添加到新词典中:

b ={}
for key, val in a.items(): # .iteritems() for Python 2.x users
   if key == 'car%s' % (range (4)):
       b[key] = val
print(b)

您的代码仍然会被破坏。 您需要进行一些更改:

  • 您需要检查的唯一前缀是"car" 忘记尝试匹配整个字符串。
  • 整个for循环可以做成一个非常简单的字典理解:

     >>> a = { ... 'car1': ('high cp', 'low fd', 'safe'), ... 'car2': ('med cp', 'med fd', 'safe'), ... 'car3': ('low cp', 'high fd', 'safe'), ... 'taxi1': ('high cp', 'low fd', 'safe', 'med wt'), ... 'taxi2': ('high cp', 'low fd', 'safe', 'high wt'), ... 'taxi3': ('high cp', 'low fd', 'safe', 'high wt') ... } >>> {k: v for k, v in a.items() if k[0:3] == 'car'} {'car2': ('med cp', 'med fd', 'safe'), 'car3': ('low cp', 'high fd', 'safe'), 'car1': ('high cp', 'low fd', 'safe')} >>> 

这有效:

new_dict = {}

for k in a.keys():
    if 'car' in k:
        new_dict[k] = a[k]

结果:

>>new_dict
{'car1': ('high cp', 'low fd', 'safe'),
 'car2': ('med cp', 'med fd', 'safe'),
 'car3': ('low cp', 'high fd', 'safe')}

您对range(4)有什么期望? 返回[0, 1, 2, 3]

b = {}
for key in range(4):
    new_key = "car%s" % key # generate new_key
    item = a.get(new_key)
    if item is not None:
        b[new_key] = item
print (b)

或者您只想让商品以car开头,请阅读此链接https://docs.python.org/3/library/stdtypes.html#str.startswith

b = {}
for key, value in a.items():
    if key.startswith("car"):
        b[key] = a[key]
print (b)

输出

{'car2': ('med cp', 'med fd', 'safe'), 
'car3': ('low cp', 'high fd', 'safe'), 
'car1': ('high cp', 'low fd', 'safe')}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM