在给定整数输入的情况下,我试图创建一个方矩阵。
例如:
router.post('/api/transactions', (req, res) => {
var productsAvailable = true
for(var i=0; i<3; i++) {
ProductM.findOne({name:"not available name"}).exec((err, product) => {
productsAvailable=false //set to false
})
console.log(productsAvailable) //this show true
}
})
我的尝试:
# for n=3
m = [[1, 2, 3], [4, 5, 6],[7, 8, 9]]
打印此结果:
m = list(list(range(1*i,(n+1)*i,i)) for i in range(1,n+1))
print(m)
该数组必须为正方形,并且必须包含连续的整数。
答案 0 :(得分:1)
这是一种方法:
n = 3
m = [list(range(1+n*i, 1+n*(i+1))) for i in range(n)]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
主要误解似乎是在发现模式。例如,可以通过1 + 3 * i
计算每列中的第一个值,其中i
在0, 1, 2
上进行迭代。对于end
的{{1}}参数,您只需要在公式中添加 n 即可,我们可以使用标识:
range
顺便说一句,如果您乐于使用第3方库,那么对NumPy来说这是微不足道的:
n*i + n = n*(i+1)
答案 1 :(得分:1)
我宁愿使用numpy(这不是列表,所以我知道它不是必需的OP,但是它仍然很有趣)
def func(n):
l = np.asarray([i for i in range(1,n**2+1)])
return l.reshape(n,n)
func(3)
>>> array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
还要考虑计算时间:
def func(n):
t = time.time()
np.arange(1, n**2 + 1).reshape((n, n))
t1 = time.time()-t
t = time.time()
np.asarray([i for i in range(1,n**2+1)]).reshape(n,n)
t2 = time.time()-t
t = time.time()
[list(range(1+n*i, 1+n*(i+1))) for i in range(n)]
t3 = time.time()-t
t = time.time()
itr = itertools.count(1) # start counting at 1
matrix = [[next(itr) for _ in range(n)] for _ in range(n)]
t4 = time.time()-t
return [t1,t2,t3,t4]
plt.plot([re[0] for re in res],'r',label = 'numpy')
plt.plot([re[1] for re in res],'b',label = 'asarray')
plt.plot([re[2] for re in res],'m',label = 'list')
plt.plot([re[3] for re in res],'g',label = 'itertool')
plt.legend()
plt.savefig('plt1.png')
对于大型矩阵,直接使用@jpp的numpy解
答案 2 :(得分:1)
您可以使用itertools.count
创建一个产生递增数字的迭代器,然后使用list comprehension函数在嵌套的next
中推进该迭代器:
import itertools
n = 3
itr = itertools.count(1) # start counting at 1
matrix = [[next(itr) for _ in range(n)] for _ in range(n)]
# result: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
答案 3 :(得分:0)
您可以使用综合列表。对于零填充矩阵:
import { translate, UserMenu, MenuItemLink, translate } from 'react-admin';
const MyUserMenu = translate(({ translate, ...props }) =>
<UserMenu {...props}>
<MenuItemLink
to="/configuration"
primaryText={translate("labels.configuration")}
leftIcon={<SettingsIcon />}
/>
</UserMenu>
对于具有连续元素的矩阵(从零开始):
mat = [[0 for i in range(N)] for i in range(N)]
对于具有连续元素(基于1)的矩阵:
mat = [[(N*j + i) for i in range(N)] for j in range(N)]
对于方形打印,可以使用:
mat = [[(N*j + i +1) for i in range(N)] for j in range(N)]