将元素附加到数组列表(以最简洁的惯用方式)

时间:2018-03-04 21:41:52

标签: python python-3.x

我写了这段代码:

reshape = tf.reshape(word_level, [-1, 100])
Wb = tf.Variable(tf.zeros([100, 100]))
C = tf.matmul(reshape ,Wb)
  

输出为[[0,-1],[1,0],[2,1]]

它有效,但有没有办法完全删除循环?

3 个答案:

答案 0 :(得分:1)

你的代码很好恕我直言。它可读,简洁,并且清楚地表明您希望修改alist

如果你想避免任何显式循环,你可以使用numpy数组并使用np.stack

import numpy as np
a = np.array([[0, 1], [1, 2], [2, 3]])
b = np.array([2, 3, 4])
np.column_stack([a, b])

输出:

array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])

答案 1 :(得分:0)

>>> alist = [[0], [1], [2]]
>>> blist = [-1, 0, 1]
>>> [a + [b] for a, b in zip(alist, blist)]
[[0, -1], [1, 0], [2, 1]]

会做你想要的(不修改alist),虽然它不是很好

答案 2 :(得分:0)

如果您不介意将元组列表作为结果,我发现此解决方案非常易读。

>>> alist = [[0], [1], [2]]
>>> blist = [-1, 0, 1] 
>>> import itertools as it
>>> list(zip(it.chain(*alist), blist))
[(0, -1), (1, 0), (2, 1)]

如果您必须有列表清单:

list(list(el) for el in zip(it.chain(*alist), blist))

基本上,我将变量alist解压缩到位置参数中,然后传递给itertools.chain()。这会产生一个平面列表[0, 1, 2]。之后,您可以简单地zip两个列表,并在不使用for循环的情况下获得所需的结果。它不是最快但有效的解决方案。