【问题标题】:String translate using dict使用 dict 进行字符串翻译
【发布时间】:2016-07-28 23:12:37
【问题描述】:

我想用dict创建的字典来替换字符向量中的字母,如下

import string

trans1 = str.maketrans("abc","cda")
trans = dict(zip("abc","cda"))
out1 = "abcabc".translate(trans1)
out = "abcabc".translate(trans)

print(out1)
print(out)

想要的输出是"cdacda"

我得到的是

cdacda
abcabc

现在out1 是所需的输出,但out 不是。我不知道为什么会这样。如何在translate 函数中使用通过dict 创建的字典?那么如果我想将translate 与trans 一起使用,我需要更改什么?

【问题讨论】:

  • 您能否在运行代码时向我们展示您的输出。有什么例外吗?我问是因为您的代码,如上所示,运行不正常。
  • 我认为你的意思是做string.maketrans("abc","cda"),它肯定不会返回与dict(zip("abc","cda"))相同的东西
  • @MagnunLeno 我添加了输出
  • 问题是字典没有做正确的翻译:字符没有转换成它们的ASCII码。
  • @cricket_007 是的,输出不同(请参阅编辑后的帖子),但我想知道如何使用 dict 版本实现相同的效果。那么如何让out 与out1 相同

标签: python string


【解决方案1】:

我认为translate 方法不会接受字典对象。此外,你应该看看你在创造什么:

>>> dict(zip("abc","cda"))
{'c': 'a', 'a': 'c', 'b': 'd'}

我不认为那是你想要的。 zip 将第一个和第二个参数中对应的索引元素配对。

你可以写一个变通方法:

def translate_from_dict(original_text,dictionary_of_translations):
    out = original_text
    for target in dictionary_of_translations:
        trans = str.maketrans(target,dictionary_of_translations[target])
        out = out.translate(trans)
    return out

trans = {"abc":"cda"}
out = translate_from_dict("abcabc",trans)
print(out)

使用dict 函数创建字典。阅读function definition。

>>> dict([("abc","cda")])
{"abc":"cda"}

【讨论】:

  • 我收到一条错误消息:TypeError: translate() 只接受一个参数(给定 2 个)
  • @user3825755 我马上就写了。我的最后一次编辑应该运行良好。
  • 通过您的编辑,它可以正常工作,但是,它不再使用dict 函数。我想知道如何在这种情况下使用 dict 函数来实现相同的输出
  • @user3825755 dict 只是一个创建字典的函数,我做了一个描述它的编辑。
  • 是的,我现在意识到了。在我看来,以天真的方式使用 translate 应该是此类 dict 对象的自然应用。感谢您的帮助
【解决方案2】:

string.translate 不支持字典作为参数:

translate(s, table, deletions='')
    translate(s,table [,deletions]) -> string

    Return a copy of the string s, where all characters occurring
    in the optional argument deletions are removed, and the
    remaining characters have been mapped through the given
    translation table, which must be a string of length 256.  The
    deletions argument is not allowed for Unicode strings.

所以,你必须编写自己的函数。

另外,修改您的代码,因为它不会在我知道的任何 python 版本中运行。它至少有 2 个例外。

【讨论】:

  • 对不起,我是一个完全的python新手。我将 Python 3.5 与 Spyder 一起使用,我编写的代码运行良好
  • @user3825755 你用的是哪个python版本?对我来说,第 3 行 (str.maketrans("abc","cda")) 有一个例外,因为 str 没有 maketrans 方法,第 6 行 (out = "abcabc".translate(trans)),无效参数和第 9 行 (print(out)),不存在变量 out。
  • 我认为是 Python 3.5。昨天有人评论说它在 Python 3.5.1 上运行良好
  • @user3825755 我正在运行 Python 3.4.1。稍后我将在装有 Python 3.5 的笔记本电脑中检查此代码。谢谢...
【解决方案3】:

str.translate 非常好地支持字典(事实上,它支持任何支持索引的东西,即__getitem__)——只是键必须是字符的 ordinal 表示,而不是角色本身。

比较:

>>> "abc".translate({"a": "d"})
'abc'
>>> "abc".translate({ord("a"): "d"})
'dbc'

【讨论】:

  • 只有 Python 3 支持通过__getitem__()进行任何映射
  • 在 python 3.8 中我无法重现这一点。我错过了什么吗?
  • @venky__ 考虑提出一个新问题;我发布的代码对我来说仍然像 Python 3.8 中描述的那样工作。
  • nvm 我遇到了一个问题,你只能有一个字母,但不能有多个字母,例如 {"ab":"xx"} 不起作用。
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 2021-12-22
  • 2018-01-30
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多