0

代码太长了,无法在这里过去,所以它在 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。

我只是不知道该怎么做。

任何提示都会很棒。我也一直在查看这个线程:删除字符串中的字符列表

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

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

4

3 回答 3

4

你所要做的就是改变这个

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,从而使所有更改累积

于 2012-11-23T20:49:44.000 回答
1

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

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 的答案是我要采用的方法。

于 2012-11-23T20:54:01.857 回答
0

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

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)
于 2012-11-23T20:59:14.977 回答