Py学习  »  Python

Python动态循环范围大小

Evaldas Lopato • 6 年前 • 1910 次点击  

我想补充一下 Link 使用python将参数设置为ini文件。ini文件示例:

[sometag]
sometext
sometext
sometext

[sometag2]
sometext2
sometext2
sometext2

[sometag3]
sometext3
sometext3
sometext3

我需要这样做:

[sometag]
sometext
sometext
sometext

Link = [sometag]

[sometag2]
sometext2
sometext2
sometext2

Link = [sometag2]
...

我的for循环:

for i in range(len(m)):
    if m[i] in t:
        for j in xrange(i, len(m)):
            if len(m[j].strip()) == 0 and m[j+1].startswith('['):
                m.insert(j, Link.....
                break


# m = ini_file.readlines()
# t = ['[sometag]', '[sometag2]']

我的代码可以工作,但它不为最后的标记添加链接。我找到原因了。如果我加上 in range(len(m)+100):

看起来像 len(m) 旧值(静态?),因为我在循环期间使用insert增加len。有什么想法吗?

我试过像 insertings = 0 ,然后 range(len(m)+insertings) 在插入之后 insertings = insertings+1 但没有运气:(

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56028
文章 [ 2 ]  |  最新文章 6 年前
ShadowRanger
Reply   •   1 楼
ShadowRanger    6 年前

使用 range 将您锁定到特定的迭代次数; range(len(m)) 构造 使用的值 len(m) 范围 s是不变的)。你 这种行为,与您希望的方式相同:

s = '123'
i = int(s)
s = 'abc'

离开 i 123 ,而不是在 int 'abc' (允许 范围(len(m)) m 改变在道德上是对等的,同样是疯狂的)。

修改 list 当你重复它的时候,它是不受欢迎的,特别是当你 insert 列表 ,或删除元素。这太容易出错了;在这种情况下,当 j ,和 插入 i + 1 下一步),同时将其插入 j > i 将由外部循环而不是内部循环看到(在这两种情况下,值 m[j]

一般来说,更安全的解决方案是 从头开始,从现有的 列表 根据需要,以及新的元素到最后。速度也快得多 插入 列表 O(n) 对于 每个 插入 O(m * n) 哪里 是所需的插入次数, n 是输入大小),而 append O(1) (总成本 O(m + n) ).

ShadowRanger
Reply   •   2 楼
ShadowRanger    6 年前

创建 新的 列表:

new = []
tag = None
for line in m:
    if line.startswith('['):
        if tag:
            new.append('Link = ' + tag)
        tag = line
    new.append(line)