如何正确循环并替换字符串中的元素?

时间:2017-04-17 08:11:34

标签: python string python-3.x

我试图理解replace方法。我有一串数字,我想做一些调整。特别是,我会根据阈值对数字进行分类:

def makeAdjustment(x):
    for each in x:
        if int(each) < 5:
            x = x.replace(each, "0")
        else:
            x = x.replace(each, "1")
    return x

使用中:

>>> makeAdjustment("800857237867") == "100111001111" 
True
>>> makeAdjustment("15889923") == "01111100" 
True
>>> makeAdjustment("14963896") == "00110111" 
True

但是,如果数字序列变大,则字符串将转换为零:

>>> makeAdjustment("366058562030849490134388085")      
'000000000000000000000000000'

4 个答案:

答案 0 :(得分:3)

此处的问题不是字符串较大,而是'1''0'的实例不应被替换。如果您稍后在字符串中遇到'1'(就像在上一个案例中一样),那么您将'1'的所有先前实例替换为'0'

一种解决方案是特殊情况:

def makeAdjustment(x):
    for each in x:
        if int(each) in {'1', '0'}:
            continue
        if int(each) < 5:
            x = x.replace(each, "0", 1)
        else:
            x = x.replace(each, "1")
    return x

这是一个选项,但它不是最好的,因为您每次迭代都会调用replace 。只需在此使用join即可做得更好:

def makeAdjustment(x):
    return "".join("1" if int(i) > 5 else "0" for i in x)

更干净,更清晰,更快:

# for loop 
%timeit makeAdjustment("366058562030849490343880185")
10000 loops, best of 3: 39.1 µs per loop
# join
%timeit makeAdjustment("366058562030849490343880185")
100000 loops, best of 3: 17.7 µs per loop

答案 1 :(得分:2)

如果要替换每个字符,请逐个字符构建新字符串,而不是使用replace

def makeAdjustment(x):
    result = []
    for each in x:
        if int(each) < 5:
            result.append("0")
        else:
            result.append("1")
    return ''.join(result)

或简称:

def makeAdjustment(x):
    return ''.join("0" if int(each) < 5 else "1" for each in x)

答案 2 :(得分:1)

我这样做的方法就是把它变成一个列表并按位置前进。它更容易,因为替换正在替换所有每个字符,无论位置在哪里这里我们使用每个字符作为索引来跟踪我们在列表中的位置

def makeAdjustment(x):
    x = list(x)
    for each in range(len(x)+1):
        if int(x[each]) < 5:
            x[each] = '0'
        else:
            x[each] = '1'
        #Turn it back into a string instead of a list 
        x = "".join(x)
        return x

答案 3 :(得分:1)

def makeAdjustment(x):
    splitted = [c for c in enumerate(x)]
    for each in splitted:
        if int(each[1]) < 5:
            splitted[each[0]] = "0"
        else:
            splitted[each[0]] = "1"

    return "".join(splitted)

编辑:上面的代码拆分字符串并生成一个元组列表,其中字符串中的每个字符都带有索引。这是使用enumerate完成的。

枚举列表(splitted),其中each[1]将包含字符串中的实际字符,而each[0]将包含给定字符串中实际字符的索引。

根据each[1]中包含的值,修改了分割的each[0]索引中包含的值。

最后,使用"".join(splitted)连接字符串。