如何从Python字典中删除非ASCII字符并用空格替换

3
我有一个字典。
a = {'age': '12\xa0', 'name': 'pks\xa0\xa0'}

我希望你能把所有非ASCII字符都替换为空格。

对于非字典中的非ASCII字符,我们使用以下方法进行删除:

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

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

将你的字符串解决方案应用到字典中的每个项目。 - undefined
你的Python版本是多少? - undefined
4个回答

4

您不需要使用列表推导式和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  '}

1
当然,但是空间呢? - undefined
@AntonvBR 问题的标题上写着“删除”。但是如果这不完全是 OP 所寻找的,他/她应该让我们知道。 - undefined
@AntonvBR 我已经尝试在我的答案中解决了空格要求的问题。 - undefined
@cᴏʟᴅsᴘᴇᴇᴅ 是的,已经修复了! - undefined
谢谢!有点绕,但你确实修复了它,对此表示赞赏。 - undefined

2

这个问题的回答基础上,您可以使用 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)上运行。


关于键,如果值也是一个字典,该如何处理? - undefined
@Prashant {k : {k2 : re.sub(r'[^\x00-\x7F]',' ', v2) for k2, v2 in v.items()} for k, v in a.items()}@Prashant {k:{k2:re.sub(r'[^\x00-\x7F]',' ',v2)for k2,v2 in v.items()} for k,v in a.items()} - undefined
@Prashant 对我来说,它的工作非常出色,而且那个正则表达式过滤掉了所有非ASCII字符。 - undefined
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()} - undefined
@Prashant 哈哈..那些是正斜杠,不是反斜杠转义序列...那是ASCII码,由有效的ASCII字符组成。(参见/xa0与\xa0) - undefined

2
您可以按照以下方式删除非打印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  '}

我喜欢你的回答(这也是为什么我给它点赞)。我的初始回答确实有完全相同的内容,但被踩了,所以我稍微改了一下..哈 - undefined

0
可以使用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 '}

1
那需要提出一个单独的问题。 - undefined

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