用于从较大的列表python中创建较小列表的函数

时间:2016-02-16 17:10:16

标签: python list function python-2.7

我有一个数字列表,我想从列表中创建行和列。 我可以强制它,并在Python 2.7中执行以下操作。

l  = [1,2,3,4,5,6,7,8,9]    
r1 = [l[0], l[1], l[2]]
r2 = [l[3], l[4], l[5]]
r3 = [l[6], l[7], l[8]]
c1 = [l[0], l[3], l[6]]

但我似乎无法在python中创建一个函数来使其工作。我的语法错了吗?

def make_row(r, li, arg1, arg2, arg3):
    r = [li[arg1], li[arg2], li[arg3]]

make_row(r1, l, 0, 1, 2)
make_row(r2, l, 3, 4, 5)
make_row(r3, l, 6, 7, 8)

有谁能告诉我我做错了什么? make_row函数似乎无法正常工作。

3 个答案:

答案 0 :(得分:2)

您的错误是how Python passes arguments中的误解。函数r中的make_row只是一个名称。分配到它时,它只是将该名称指向新的东西,在函数的上下文中,将旧对象和函数外的旧名称保持不变。

如果您返回make_row的结果,您可以看到它生成正确的输出,它只是不会像您想象的那样将其保存到变量中。

然而,有更容易(和更多Pythonic)的方法来做你想做的事情:

这将返回

的列表
[l[i:i+3] for i in xrange(0, len(l), 3)]

这相当于

[l[i::3] for i in xrange(0, 3)]

如果您想要不同长度的行/列,只需用这些数字代替这些语句中的3&#39。

答案 1 :(得分:0)

你的函数make_row尽我所知(我还没有测试过),但你需要return r

答案 2 :(得分:0)

好吧我想我想出了自己的问题。代码应如下所示。

def make_row(li, arg1, arg2, arg3):
    r = [li[arg1], li[arg2], li[arg3]]
    return r
row1 = make_row(li, 0, 1, 2)