Python:按键选择字典项

4

我有这个字典:

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'), 
}

我在这里漏掉了什么?


1
你只是打印了包含“car”的键,而没有将它们添加到另一个字典中。 - Fejs
5个回答

6

你正在错误地检查前缀,并且没有存储结果。你可以使用 str.startswith 和字典推导式生成结果:

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

3

如果您想添加包含单词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)

1
你比我快了17秒 :) - Roman

1
你验证的键没有被使用,只是被 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)

你的代码仍然有问题。你需要做出一些改变:
  • The only prefix you need to check is "car". Forget trying to match the whole string.
  • This entire for loop could be made into a very simple dictionary 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')
    ... }
    >>> {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')}
    >>> 
    

1
这个可以工作:

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')}

0
你对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')}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接