我有这两个列表
indexes = [4, 2, 4, 6]
values = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
我希望合并这些列表。每个索引值对应于合并的列表大小。
[[0, 1, 2, 3], [0, 1], [2, 3, 0, 1], [2, 3, 0, 1, 2, 3]]
我目前的答案是可以的,但我想知道是否有更好的方法。
ids = []
cIndex = 0
for i in indexes:
ids.append([values[cIndex+x] for x in xrange(i)])
cIndex += i
答案 0 :(得分:1)
您可以将{em> list comprehension 表达式与pyspark rdd isCheckPointed() is false一起使用为:
LinearLayout
答案 1 :(得分:1)
常规for循环是一种可读的解决方案。但是,不需要列表理解,只需保持列表中的当前位置进行切片。
def split(idxes, vals):
res = []
pos = 0
for i in idxes:
res.append(vals[pos:pos+i])
pos += i
return res
或者,如果您特别想导入itertools
,虽然这里并不需要,但您可以获取索引的累积总和,然后使用pairwise
配方。
from itertools import accumulate, tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
喜欢这样
>>> [values[beg:end] for beg, end in pairwise(accumulate([0]+indexes))]
[[0, 1, 2, 3], [0, 1], [2, 3, 0, 1], [2, 3, 0, 1, 2, 3]]
答案 2 :(得分:1)
indexes = [4, 2, 4, 6]
values = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
l=[]
l2=[]
j=0
for i in range(len(indexes)):
k=0
while k < indexes[i]:
l.append(values[j])
j+=1
k+=1
l2.append(l)
l=[]
print(l2)
# [[0, 1, 2, 3], [0, 1], [2, 3, 0, 1], [2, 3, 0, 1, 2, 3]]