我在试着理解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'

最佳答案

这里的问题不是字符串太大,而是不应该替换'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

关于python - 如何正确循环并替换字符串中的元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43447690/

10-12 21:09