【问题标题】:How to remove from Python Dictionary Non ASCII characters and replacing with spaces如何从 Python 字典中删除非 ASCII 字符并替换为空格
【发布时间】:2018-07-02 09:29:12
【问题描述】:

我有字典

a = {'age': '12\xa0', 'name': 'pks\xa0\xa0'}

我想删除所有非 ASCII 字符并替换为空格。

为了删除非字典中的非 ASCII 字符,我们正在使用

''.join([i if 32 < ord(i) < 126 else " " for i in a])

但是如何使用字典。 任何帮助将不胜感激。

【问题讨论】:

  • 将您的字符串解决方案应用于字典中的每个项目。
  • 你的python版本是什么?

标签: python dictionary


【解决方案1】:

可以使用map 对字典进行迭代:

for k,v in a.items():
    a[k] = "".join(map(lambda c: c if 32<ord(c)<127 else " " , v))

print(a) 给出以下输出:

{'name': 'pks  ', 'age': '12 '}

【讨论】:

  • 那需要一个单独的问题。
【解决方案2】:

您不需要列表理解,ord 只需编码为 ascii 并忽略错误:

In [106]: {key:value.encode('ascii',errors='ignore') for key, value in a.items()}
Out[106]: {'age': b'12', 'name': b'pks'}

如果你想用空格替换这里是一种有效的方法:

In [117]: def replace_nonascii(mydict):
              for key, value in a.items():
                  new = value.encode('ascii',errors='ignore')
                  yield key, new + b' ' * (len(value) - len(new))
   .....:         

In [118]: dict(replace_nonascii(a))
Out[118]: {'age': b'12 ', 'name': b'pks  '}

【讨论】:

  • 当然可以,但是空间呢?
  • @AntonvBR 问题的标题是删除。但如果这不是 OP 正在寻找的,他/她应该让我们知道。
  • @AntonvBR 我已尝试解决我的答案中的空格要求。
  • @cᴏʟᴅsᴘᴇᴇᴅ 是的,刚刚修复!
  • 谢谢!有点迂回,你已经修好了,所以支持它。
【解决方案3】:

基于this question 的答案,您可以使用re.sub,删除非ASCII 字符并用空格替换它们。

>>> import re
>>> {k : re.sub(r'[^\x00-\x7F]',' ', v) for k, v in a.items()}
{'age': '12 ', 'name': 'pks  '}

这应该适用于 python-3.x (python) 和 python-2.x (pythoff)。

【讨论】:

  • 关于键,如果值也是字典,那怎么办?
  • @Prashant {k : {k2 : re.sub(r'[^\x00-\x7F]',' ', v2) for k2, v2 in v.items()} for k, v in a.items()}
  • @Prashant 它对我来说非常有用,并且该正则表达式过滤掉任何不是 ASCII 的内容。
  • a2 = {'a1':{'name':'pks/xa0/xa0', 'age':'12/xa0/xa0'},'a3':{'name':'kps/xa0/xa0', 'age':'23/xa0/xa0'}} 我申请了ans ={k : {k2 : re.sub(r'[^\x00-\x7F]',' ', v2) for k2, v2 in v.items()} for k, v in a2.items()}
  • @Prashant Lol.. 这些是正斜杠,而不是反斜杠转义序列......这是 ASCII,由有效的 ascii 字符组成。 (参见 /xa0 与 \xa0)
【解决方案4】:

您可以像这样删除不可打印的 ascii 字符;它将您提供的代码行用空格替换不可打印的 ascii,应用于字典中的每个值:

def remove_non_printable_ascii(s):
    return ''.join([c if 32 < ord(c) < 127 else " " for c in s])

a = {'age': '12\xa0', 'name': 'pks\xa0\xa0'}

for k in a:
    a[k] = remove_non_printable_ascii(a[k])

a

输出:

{'age': '12 ', 'name': 'pks  '}

【讨论】:

  • 我喜欢你的回答(这就是我赞成它的原因)。我最初的回答确实有完全相同的东西,但它是 dv'd 所以我改变了一点.. 哈
猜你喜欢
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 2014-05-06
相关资源
最近更新 更多