本质上,我需要编写一个更快的实现来替换insert()方法,在列表中特定位置插入元素。
输入以列表形式给出,格式为[(索引, 值), (索引, 值), (索引, 值)]
例如:在100万个元素的列表中插入1万个元素大约需要2.7秒。
def do_insertions_simple(l, insertions):
"""Performs the insertions specified into l.
@param l: list in which to do the insertions. Is is not modified.
@param insertions: list of pairs (i, x), indicating that x should
be inserted at position i.
"""
r = list(l)
for i, x in insertions:
r.insert(i, x)
return r
我可以帮助您翻译中文,涉及IT技术相关内容。您需要提供的内容是需要将插入操作完成所需时间加快8倍或更多。
我目前的实现方式:
def do_insertions_fast(l, insertions):
"""Implement here a faster version of do_insertions_simple """
#insert insertions[x][i] at l[i]
result=list(l)
for x,y in insertions:
result = result[:x]+list(y)+result[x:]
return result
样例输入:
import string
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
insertions = [(0, 'a'), (2, 'b'), (2, 'b'), (7, 'c')]
r1 = do_insertions_simple(l, insertions)
r2 = do_insertions_fast(l, insertions)
print("r1:", r1)
print("r2:", r2)
assert_equal(r1, r2)
is_correct = False
for _ in range(20):
l, insertions = generate_testing_case(list_len=100, num_insertions=20)
r1 = do_insertions_simple(l, insertions)
r2 = do_insertions_fast(l, insertions)
assert_equal(r1, r2)
is_correct = True
我运行上述代码时遇到的错误:
r1: ['a', 0, 'b', 'b', 1, 2, 3, 'c', 4, 5, 6, 7, 8, 9]
r2: ['a', 0, 'b', 'b', 1, 2, 3, 'c', 4, 5, 6, 7, 8, 9]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-54e0c44a8801> in <module>()
12 l, insertions = generate_testing_case(list_len=100, num_insertions=20)
13 r1 = do_insertions_simple(l, insertions)
---> 14 r2 = do_insertions_fast(l, insertions)
15 assert_equal(r1, r2)
16 is_correct = True
<ipython-input-7-b421ee7cc58f> in do_insertions_fast(l, insertions)
4 result=list(l)
5 for x,y in insertions:
----> 6 result = result[:x]+list(y)+result[x:]
7 return result
8 #raise NotImplementedError()
TypeError: 'float' object is not iterable
该文件使用nose框架来检查我的答案等,所以如果有任何您不认识的函数,可能是该框架中的函数。
我知道它正确地插入了列表,但它仍然会出现“浮点对象不可迭代”的错误。
我也尝试过另一种方法,它确实起作用(切分了列表,添加了元素,添加了剩余的列表,然后更新了列表),但比insert()慢10倍。
我不确定如何继续下去。
编辑:我一直在错误地看待整个问题,现在我将尝试自己解决它,但如果我再次陷入困境,我将提出一个不同的问题并在此处链接。
list(y)
尝试迭代y
并将其转换为列表。如果你只想将y
转换为只有一个元素的列表,可以直接使用[y]
。 - b_cinsert
更快速 :) - iz_