是否有更简洁的方法来执行此循环?

时间:2014-09-15 07:24:51

标签: python django

任何人都可以帮我提出一个解决方案,使这个循环更简单。代码运行良好,但它似乎太多了。

    font_sizes = map(int, re.findall(r'\\fs(\d+)', rtf)) # Get all the font sizes
    # Set font sizes
    for font_size in font_sizes:
        font_size = (font_size / 2)
        if font_size <= 8:
                rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(1))
        else:
            if 9 <= font_size <= 11:
                rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(2))
            else:
                if 12 <= font_size <= 13:
                    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(3))
                else:
                    if 14 <= font_size <= 17:
                        rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(4))
                    else:
                        if 18 <= font_size <= 31:
                            rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(5))
                        else:
                            if 32 <= font_size <= 34:
                                rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(6))
                            else:
                                if 35 <= font_size <= 59:
                                    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(7))
                                else:
                                    if font_size > 60:
                                        rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(8))
                                    else:
                                        pass

1 个答案:

答案 0 :(得分:11)

首先,您可以使用elif来避免必须如此深入地嵌套:

if font_size <= 8:
    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(1))

elif 9 <= font_size <= 11:
    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(2))

elif 12 <= font_size <= 13:
    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(3))

# etc

您可以完全放弃else: passelse是可选的,您应该在不使用时省略它。

接下来,分解出共同的元素; str.replace()电话;它们之间的不同之处是替换fontsize,在每个分支中选择

if font_size <= 8:
    size = 1
elif 9 <= font_size <= 11:
    size = 2
elif 12 <= font_size <= 13:
    size = 3
# etc.

rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(size))

更具可读性,因为你不是一直在重复自己。

您可以每次删除下限,因为您已经使用前面的测试消除了下限:

if font_size <= 8:
    size = 1
elif font_size <= 11:
    size = 2
elif font_size <= 13:
    size = 3
# etc.

现在你拥有的只是bisection problem;找到使用font-size的大小就像在font_sizes列表中找到它的插入点一样简单;您要插入的是0到7之间的索引,因此您需要添加1:

import bisect

font_sizes = [8, 11, 13, 17, 31, 34, 59]
size = bisect.bisect_left(font_sizes, font_size) + 1
rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(size))

我不确定为什么要将字体大小除以2;以上3行的字体大小划分。

由于您要替换元素,因此您应该在这里使用re.sub(),使用函数来生成替换元素:

def insert_fontsize(match):
    font_sizes = [16, 22, 26, 34, 62, 68, 118]
    size = bisect.bisect_left(font_sizes, int(match.group(1))) + 1
    return '<font size="{0}">'.format(size)

re.sub(r'\\fs(\d+)', insert_fontsize, rtf)

现在re.sub()调用将执行循环,而不是循环,然后进行手动替换。