您好我正在寻找一种基于某些值拆分列表的方法,并假设列表的长度等于某些值的总和,例如:
列表: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
,我希望能够获得更好的代码,任何建议都表示赞赏,谢谢!
答案 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