我需要从xml字段组装一个长文本字符串。
XML_FIELD_ONE =“Iamacatthatisoddly免疫学”
XML_FILED_TWO = 7,8,24
FILED_TWO包含插入\n或\r的索引。如果两个索引相隔1(如7、8),则需要插入\r\n。如果索引是单人的(如24),则需要插入\n。
使用此代码处理25K行文件大约需要2分钟。我做错了什么?
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这样做的简单方法是:
for offset in XML_FILED_TWO:
XML_FILED_ONE[offset] = \n但这违反了“如果两个偏移在一起,第一个是\r,下一个是\n”
发布于 2017-02-22 23:38:19
当您只需要一个循环时,您就编写了一个三重循环;这是非常低效的。您知道插入新项目的确切位置:直接到那里,而不是增加两个计数器来查找位置。
我不确定你需要插入的确切位置,但这应该是接近的。为了使原始索引保持正确,您需要从右侧插入并向左工作;这就是我反向XML_FIELD_TWO的原因。
我离开了调试打印语句。
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)输出:
['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发布于 2017-02-23 00:00:55
您可以使用python enumerate()函数在单个循环中生成一系列索引/值对。然后,可以使用list.insert(pos, val)方法插入所需的字符。
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)发布于 2017-02-23 00:01:31
这里有一个线性算法来实现你想要做的事情。实际上,在这里使用try-except是非常合适的,但是除了
>>> 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中使用的索引,以保持原始索引的正确性。
https://stackoverflow.com/questions/42404062
复制相似问题