首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引/偏移性能很糟糕--我做错了什么?Python

索引/偏移性能很糟糕--我做错了什么?Python
EN

Stack Overflow用户
提问于 2017-02-22 23:12:30
回答 3查看 46关注 0票数 0

我需要从xml字段组装一个长文本字符串。

XML_FIELD_ONE =“Iamacatthatisoddly免疫学”

XML_FILED_TWO = 7,8,24

FILED_TWO包含插入\n或\r的索引。如果两个索引相隔1(如7、8),则需要插入\r\n。如果索引是单人的(如24),则需要插入\n。

使用此代码处理25K行文件大约需要2分钟。我做错了什么?

代码语言:javascript
复制
XML_FIELD_ONE = list("Iamacatthatisoddlyimmunetocatnip")
XML_FILED_TWO = [7,8,24]

idx = 0
while idx <= len(XML_FIELD_ONE):
   for position in XML_FIELD_ONE:
       for space in XML_FIELD_TWO:

             if idx == int(space) and idx+1 == int(space)+1:
               XML_FIELD_ONE[idx] = "\r"

                        try:
                            XML_FIELD_ONE[idx+1] = "\n"
                        except:
                            pass

              elif idx == int(space):
                 XML_FIELD_ONE[idx] = "\n"

    idx += 1


new_text = "".join(XML_FIELD_ONE)
return new_text

这样做的简单方法是:

代码语言:javascript
复制
for offset in XML_FILED_TWO:
    XML_FILED_ONE[offset] = \n

但这违反了“如果两个偏移在一起,第一个是\r,下一个是\n”

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-22 23:38:19

当您只需要一个循环时,您就编写了一个三重循环;这是非常低效的。您知道插入新项目的确切位置:直接到那里,而不是增加两个计数器来查找位置。

我不确定你需要插入的确切位置,但这应该是接近的。为了使原始索引保持正确,您需要从右侧插入并向左工作;这就是我反向XML_FIELD_TWO的原因。

我离开了调试打印语句。

代码语言:javascript
复制
XML_FIELD_ONE = list("Iamacatthatisoddlyimmunetocatnip")
XML_FIELD_TWO = [7,8,24]

print XML_FIELD_ONE
XML_FIELD_TWO = XML_FIELD_TWO[::-1]
print XML_FIELD_TWO
i = 0
while i < len(XML_FIELD_TWO):
    print i, XML_FIELD_TWO[i]
    if XML_FIELD_TWO[i] - XML_FIELD_TWO[i+1] == 1:
        XML_FIELD_ONE.insert(XML_FIELD_TWO[i], '\r\n')
        i += 2
    else:
        XML_FIELD_ONE.insert(XML_FIELD_TWO[i], '\n')
        i += 1

    print "\n", ''.join(XML_FIELD_ONE)

输出:

代码语言:javascript
复制
['I', 'a', 'm', 'a', 'c', 'a', 't', 't', 'h', 'a', 't', 'i', 's', 'o', 'd', 'd', 'l', 'y', 'i', 'm', 'm', 'u', 'n', 'e', 't', 'o', 'c', 'a', 't', 'n', 'i', 'p']
[24, 8, 7]
0 24

Iamacatthatisoddlyimmune
tocatnip
1 8

Iamacatt
hatisoddlyimmune
tocatnip
票数 1
EN

Stack Overflow用户

发布于 2017-02-23 00:00:55

您可以使用python enumerate()函数在单个循环中生成一系列索引/值对。然后,可以使用list.insert(pos, val)方法插入所需的字符。

代码语言:javascript
复制
XML_FIELD_ONE = list("Iamacatthatisoddlyimmunetocatnip")
XML_FIELD_TWO = [7,8,24]

last_i = len(XML_FIELD_TWO) - 1

for i,p in enumerate(XML_FIELD_TWO):
    ch = '\r' if i < last_i and XML_FIELD_TWO[i+1] == p+1 else '\n'
    XML_FIELD_ONE.insert(p, ch)

print(XML_FIELD_ONE)
票数 1
EN

Stack Overflow用户

发布于 2017-02-23 00:01:31

这里有一个线性算法来实现你想要做的事情。实际上,在这里使用try-except是非常合适的,但是除了

代码语言:javascript
复制
>>> XML_FIELD_ONE = list("Iamacatthatisoddlyimmunetocatnip")
>>> XML_FIELD_TWO = [7,8,24]
>>> insertions = 0
>>> for i, e in enumerate(XML_FIELD_TWO):
...     try:
...         cont = e + 1 == XML_FILED_TWO[i+1]
...     except IndexError:
...         cont = False
...     if cont:
...         XML_FI.insert(e+1+insertions, '\r\n')
...         XML_FIELD_ONE.insert(e+1+insertions, '\r\n')
...     else:
...         XML_FIELD_ONE.insert(e + insertions, '\n')
...     insertions += 1
...
>>> print("".join(XML_FIELD_ONE))
Iamacatt

hatisoddlyimmune
tocatnip
>>>

我跟踪插入的数量,这些插入抵消了.insert中使用的索引,以保持原始索引的正确性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42404062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档