【问题标题】:Trouble with Changing Characters in a String Then Returning the String更改字符串中的字符然后返回字符串的问题
【发布时间】:2012-11-12 04:46:36
【问题描述】:

代码太长,无法在这里粘贴,所以在 PasteBin 上:http://pastebin.com/UDPFYsLJ

我想要实现的是能够输入“555-GET-FOOD”之类的内容并获得“555-438-3663”。

我有将字母更改为数字的代码……只是在完全不同的行上。以下是一小段摘录:

Number:  555-GET-FOO3
Number:  555-4ET-FOOD
Number:  555-GET-3OOD

它正确地更改了字母并保留了数字,但它们都在不同的行上。我知道我让它在 for 循环中运行,但我希望对前一个循环所做的更改保留在当前循环中。

例如,如果第一个循环返回 555-GET-FOO3,我希望下一个循环能够获取它,以便它可以返回 555-4ET-FOO3。

我只是不知道该怎么做。

任何提示都会很棒。我也一直在看这个帖子:Removing a list of characters in string

但是,我没有对 translate 函数做太多(或者,任何事情),并且很难在 Python 文档之外找到一个好的演练。

这是给学校的,我们不能使用 Python 3,我们必须使用 Python 2.7,所以我认为 maketranslate 不会起作用。

【问题讨论】:

  • maketrans 在 python2.x 上应该可以正常工作...
  • @mgilson:虽然我同意你的观点,但我认为 OP 是一个初学者,试图“学习绳索”。因此,虽然对maketransstr.translate 的引用是进一步阅读的良好参考,但我认为一个好的答案应该可以帮助她了解她的算法出了什么问题。反对/同意?
  • @inspectorG4dget -- 在帮助新手与创建对他人真正有用的东西以在生产代码中使用 SO 的精神与作业帮助网站。在这种情况下,我相信maketrans 是一个(?)适合这项工作的工具,所以我不希望它宣传“maketrans 在 py2.x 中不起作用”。我也很难处理迫使我查看粘贴箱的代码,因为它太长了。通常归结为发布的最小示例可以帮助 OP 找到她自己的问题... :.agree 和 dissagree
  • @mgilson:你有 10 分钟吗?我想和你聊聊我的想法
  • @inspectorG4dget -- 我回复了你的评论然后离开了我的电脑。对此感到抱歉。

标签: python


【解决方案1】:

你所要做的就是改变这个

for i, j in dict.iteritems():
    newNumber = phoneNum.replace(i, j)
    print "Number: ",newNumber

到这里:

for i, j in dict.iteritems():
    phoneNum = phoneNum.replace(i, j)
    print "Number: ",newNumber

解释

在您的方法中,您替换了原始电话号码中的一些字符并将结果分配给名为newNumber 的新变量。但是,你对newNumber 什么都不做,所以它被扔掉了。

相反,如果您用翻译结果覆盖输入 (phoneNum),那么您所做的任何新翻译都将使用新覆盖的 phoneNum 值进行,从而使所有更改累积

【讨论】:

  • 哈,在您对帖子的评论中+1 - 我认为您的回答更好:)
  • facepalm 这就是我没有正确阅读问题的结果。绝对是上下文中的最佳答案,所以 +1。
  • 啊!完美,非常感谢。 (:这完全有道理。我想我离它太近了,看不清楚。(:我相信其他答案有更好的方法,但它们有点超出我的想象。正如你所怀疑的那样早些时候,我是初学者;这是我第一个学期的 Python。
【解决方案2】:

假设你有一个字母到数字的映射,你可以试试这个:

In [1]: s = '555-GET-FOOD'

In [2]: num_map = {'D': 3, 'F': 3, 'O': 6}

In [3]: reduce(lambda x, y: x.replace(y, str(num_map[y])), num_map, s)
Out[3]: '555-GET-3663'

这通过将字母映射到数字 (num_map),然后使用 reduce 遍历映射的每个键(字母),将字母替换为相应的数字。

但是,由于这是针对学校的,这种方法可能有点晦涩(以一种糟糕的方式 :)),而@inspectorG4dget 的答案是我会采用的方法。

【讨论】:

  • 呃-哦...我创建了一个 reduce 怪物 ;-)
  • @inspectorG4dget Ha,前几天在 mgilson 的建议下提出了一个答案
  • @mgilson 哈哈,确实有!
  • 在这种情况下(1个字符替换),我想我更喜欢简单的join''.join(num_map.get(k,k) for k in s)
  • @mgilson Ha,再次胜出!绝对是更好的方式。我做了一个快速的timeit 测试——我想join 版本由于get 调用的开销而有点慢?还是因为它遍历字符串中的每个字符?
【解决方案3】:

尝试不同的方法:与其替换字符,不如从您的输入字符串中创建一个新字符串,并翻译字母。您可以像这样遍历字符串的字符:

for ch in a_string:
    print ch

一旦您可以做到这一点,只需创建一个字母到数字的映射,您就可以在其中查找一个字符并找到其对应的数字。如果您在映射中找到匹配项,则使用该匹配项,如果没有,则使用您的原始字符:

# Map of letters to digits: you'd pad this out.
letter_map = {'G': 4, 'E': 3, 'T': 7, 'D': 3}
def remap_phone_number(original):
    result = []
    for ch in original:
        result.append(letter_map[ch] if ch in letter_map else ch)
    return ''.join(result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多