根据某些值切片列表

时间:2016-09-27 02:57:22

标签: python python-2.7

您好我正在寻找一种基于某些值拆分列表的方法,并假设列表的长度等于某些值的总和,例如:

列表:l = ['a','b','c','d','e','f'] 值:v = (1,1,2,2) 所以len(l) = sum(v)

我希望有一个返回元组或列表的函数,例如:(['a'], ['b'], ['c','d'], ['d','e'])

目前我的代码如下:

(list1,list2,list3,list4) = (
    l[0:v[0]], 
    l[v[0]:v[0]+v[1]], 
    l[v[0]+v[1]:v[0]+v[1]+v[2]], 
    l[v[0]+v[1]+v[2]:v[0]+v[1]+v[2]+v[3]])`

我正在考虑让这个更清楚,但到目前为止最接近的是(注意结果不正确,不是我想要的)

s=0
[list1,list2,list3,list4] = [l[s:s+i] for i in v]

问题是我在s中迭代值时无法同时增加v,我希望能够获得更好的代码,任何建议都表示赞赏,谢谢!

5 个答案:

答案 0 :(得分:2)

如果你不是坚持使用古老的Python,我会指引你itertools.accumulate。当然,即使在古老的Python上,你也可以使用我链接的文档中提供的(大致)等效代码来实现它。使用Py3代码或等效代码,您可以:

v

答案 1 :(得分:1)

您可以编写一个简单的循环来迭代l = ['a','b','c','d','e','f'] v = (1,1,2,2) result = [] offset = 0 for size in v: result.append(l[offset:offset+size]) offset += size print result 以生成结果:

[['a'], ['b'], ['c', 'd'], ['e', 'f']]

输出:

    var point = new Point(label1.Location.X + label1.Width,
        label1.Location.Y);
    var p2 = panel1.Controls[1].Location;
    var ctrl = panel1.GetChildAtPoint(point);
    if (ctrl is TextBox)
    {
        textBox1.Text = "Got TextBox";
    }
    else if (ctrl is Label)
    {
        textBox1.Text = "Got Label";
    }

    textBox1.Text += string.Format(" {0}:{1} {2}:{3}", point.X, point.Y, p2.X, p2.Y);

答案 2 :(得分:1)

也许在l?

中生成值的生成器
{!! Form::select('user_id', $users, null) !!}

答案 3 :(得分:1)

这里的想法是使用嵌套循环。假设您的条件始终为真,那么逻辑就是运行=并从v中选取i元素,其中l是来自{{1}的数字}。

i

输出: v

第一个答案https://stackoverflow.com/a/39715361/5759063是最狡猾的方式。这只是算法的主干。

答案 4 :(得分:1)

我能找到的最好的是两线解决方案:

breaks=[0]+[sum(v[:i+1]) for i in range(len(v))]  #build a list of section indices
result=[l[breaks[i]:breaks[i+1]] for i in range(len(breaks)-1)]  #split array according to indices
print result