如何定期将元素插入向量

时间:2019-05-24 05:35:26

标签: python list numpy

我有以下列表。

vector = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
inserted_elements = [2, 2, 2, 2, 2]

我想通过每两个元素插入以下内容。

output = [1, 2, 2, 3, 4, 2, 5, 6, 2, 7, 8, 2, 9, 10, 2]

不仅Python列表而且使用numpy数组的答案都很好。

5 个答案:

答案 0 :(得分:1)

我认为没有简单的NumPy方法可以对任何可能的数组大小执行此操作,但是这是使用迭代器和列表理解的python方法:

it1, it2 = map(iter, (vector, inserted_elements))
n = sum(map(len, (vector, inserted_elements)))

[next(it2) if i % 3 == 0 else next(it1) for i in range(1, n+1)]
# [1, 2, 2, 3, 4, 2, 5, 6, 2, 7, 8, 2, 9, 10, 2]
输出中的每个

3个 rd 元素都将来自it2的迭代器inserted_elements。其余部分来自it1,对应于vector

答案 1 :(得分:1)

numpy数组步骤:

1。

>>> a=np.reshape(np.matrix([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),(5, 2))
>>> a
matrix([[ 1,  2],
        [ 3,  4],
        [ 5,  6],
        [ 7,  8],
        [ 9, 10]])

2。

>>> b=np.reshape(np.matrix([2, 2, 2, 2, 2]),(5, 1))
>>> b
matrix([[2],
        [2],
        [2],
        [2],
        [2]])

3。

>>> M = np.append(a, b, axis=1)
>>> M
matrix([[ 1,  2,  2],
        [ 3,  4,  2],
        [ 5,  6,  2],
        [ 7,  8,  2],
        [ 9, 10,  2]])

4。

>>> result=np.array(M).flatten()
>>> result
array([ 1,  2,  2,  3,  4,  2,  5,  6,  2,  7,  8,  2,  9, 10,  2])

答案 2 :(得分:1)

传统的for循环方法如下所示,您可以从vector中选择2个元素,从inserted_elements中选择1个元素,并制作output列表

vector = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
inserted_elements = [2, 2, 2, 2, 2]

output = []

#Pick two elements from vector and one element from inserted_elements and add it to output list
for idx in range(0,len(vector),2):

    output.extend(vector[idx:idx+2] + [inserted_elements[int(idx/2)]])

print(output)

列表理解中的同一件事将是

output = [ v for idx in range(0,len(vector),2) for v in vector[idx:idx+2] + [inserted_elements[int(idx/2)]]]

输出将为

[1, 2, 2, 3, 4, 2, 5, 6, 2, 7, 8, 2, 9, 10, 2]

答案 3 :(得分:1)

这是一个有点晦涩的方法-但它比其他任何方法(到目前为止)都快:

list(itertools.chain(*zip(*[iter(vector)]*2+[iter(inserted_elements)]))) 

它使用“成语”来获取n个大小为[iter(alist)]*nitertools.chain的项目,以扁平化嵌套列表。

已删除的答案使用了np.insert。为此,我相信insert使用掩蔽,如下所示:

def foo(vector, inserted_elements):
    res = np.zeros(len(vector)+len(inserted_elements),int)  
    mask = res.astype(bool) 
    mask[2::3]=True 
    res[mask]=inserted_elements 
    res[~mask]=vector    
    return res

np.append答案的一种变化是:

np.column_stack((np.reshape(vector,(-1,2)), inserted_elements)).ravel()

我通常不喜欢np.append,因为它经常被滥用,尤其是在循环中。为此,可以,但是我认为column_stack更加干净。

===

In [254]: list(zip(*[iter(vector)]*2+[iter(inserted_elements)]))                                         
Out[254]: [(1, 2, 2), (3, 4, 2), (5, 6, 2), (7, 8, 2), (9, 10, 2)]

答案 4 :(得分:1)

这是一种基于itertools的方法,该方法也适用于将任意数量的元素从一个列表插入到另一个列表中。为此,我定义了一个生成器函数,它将在每个l2项中将l1中的元素和元素从i插入到def insert_n(l1, l2, i): while True: try: yield from islice(l1, i) yield next(l2) except StopIteration: return 中:

i

这可以通过使用itertools.islice在每次迭代中从迭代器l1产生多达for v in g: yield v个项目的方式来实现。借助yield from,我们可以产生与切片的可迭代对象中的项目一样多的项目,因此可迭代对象将用尽(yield的快捷方式)。

最后,我们可以用try / expect包装StopIteration语句以捕获vector = iter([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) inserted_elements = iter([2, 2, 2, 2, 2]) list(insert_every_n(vector, inserted_elements, i=2)) # [1, 2, 2, 3, 4, 2, 5, 6, 2, 7, 8, 2, 9, 10, 2] 警告。


让我们尝试以下示例:

l2

如果我们想每3项添加一个vector = iter([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) inserted_elements = iter([2, 2, 2, 2]) list(insert_every_n(vector, inserted_elements, i=3)) # [1, 2, 3, 2, 4, 5, 6, 2, 7, 8, 9, 2, 10, 2] 项:

FrameLayout