2016-12-15 44 views
1

词典词条我有这个词典:的Python:通过选择键

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

从上面的解释,我希望创建一个只包含“汽车%s”的

我使用了一个新的字典此code snippet(从另一个问题)

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

它返回{}

I E xpect得到:

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

我在这里错过了什么?

+1

你只是打印键,带'汽车'在他们身上,而不是添加到另一个字典中。 – Fejs

回答

2

如果你想添加包含在它的字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) 

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

  • 您需要检查的唯一前缀是"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')} 
    >>> 
    
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')} 
2

你以错误的方式检查前缀,你不是sto结果。你可以使用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)' 
0

你对范围(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')}