【问题标题】:Remove space from dictionary keys从字典键中删除空格
【发布时间】:2016-03-03 06:50:53
【问题描述】:

我有一个包含键/值的字典,例如:

{'C  14': ['15263808', '13210478'], 'W   1': ['13122205']}

如何从所有键中删除空格,以便它们改为:

{'C14': ['15263808', '13210478'], 'W1': ['13122205']}

【问题讨论】:

  • 您要编辑现有词典还是创建新词典?是否需要对碰撞键做些什么?
  • 所有键都是唯一的,理想情况下,空格将从现有字典键中删除。

标签: python dictionary


【解决方案1】:

您可以处理字典理解中的所有键;您可以使用str.translate() 删除空格; Python 2 版本是:

{k.translate(None, ' '): v for k, v in dictionary.iteritems()}

Python 3 版本是:

{k.translate({32: None}): v for k, v in dictionary.items()}

您也可以使用str.replace() 删除空格:

{k.replace(' ', ''): v for k, v in dictionary.items()}

但是对于较长的键,这可能会更慢;见Python str.translate VS str.replace

请注意,这些会产生一个字典。

Python 2 演示:

>>> d = {'C  14': ['15263808', '13210478'], 'W   1': ['13122205']}
>>> {k.translate(None, ' '): v for k, v in d.iteritems()}
{'W1': ['13122205'], 'C14': ['15263808', '13210478']}

还有一个 2.6 兼容版本(使用Alternative to dict comprehension prior to Python 2.7):

dict((k.translate(None, ' '), v) for k, v in dictionary.iteritems())

【讨论】:

【解决方案2】:

你也可以只用str.replace:

In [4]: d = {'C  14': ['15263808', '13210478'], 'W   1': ['13122205']}

In [5]: d = {k.replace(" ",""): v for k,v in d.items()}

In [6]: d
Out[6]: {'C14': ['15263808', '13210478'], 'W1': ['13122205']}

对于python2.6:

d = dict((k.replace(" ",""),v)  for k,v in d.items())

【讨论】:

  • 这是在 Python 2.6.6 上,所以字典理解不起作用
  • @GreyTek 只需将其替换为 gen exp 和 dict 调用
【解决方案3】:

没有字典理解:

>>> d = {'C  14': ['15263808', '13210478'], 'W   1': ['13122205']}
>>> dict(((k.replace(' ',''),v) for k,v in d.items()))
{'W1': ['13122205'], 'C14': ['15263808', '13210478']}

【讨论】:

  • 去掉方括号;首先构建一个生成器表达式将执行的列表是没有意义的。
【解决方案4】:

这是一个没有 dict 理解的解决方案,它就地编辑字典,并假设没有两个旧键将映射到同一个新键。

d = {'C  14': ['15263808', '13210478'], 'W   1': ['13122205']}

for key in d.keys():
    if ' ' in key:
        d[key.translate(None, ' ')] = d[key]
        del d[key]

print d # {'W1': ['13122205'], 'C14': ['15263808', '13210478']}

经过一段时间后,这比创建新字典快 25%。

循环直接迭代 d.keys() 而不是 d 以避免重新访问键并避免整个“迭代变化的对象”问题。

【讨论】:

  • 翻译实际上应该更快;不过,也许我需要为单个字符替换重新计时。
  • @StevenRumbalski 我修复了删除密钥的问题,作者使用的是Python 2.6,所以不需要考虑Python 3.X。
  • @MartijnPieters 根据我的测试,在这种情况下,replace 对于单个字符替换的运行速度比translate 快 1-2%;很高兴知道一般translate 会更快。
  • 更新后的代码是否仍然准确?你能分享你的基准吗?
猜你喜欢
  • 1970-01-01
  • 2019-09-17
  • 2019-09-26
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多