根据索引从两个列表中创建列表

时间:2017-11-22 20:20:33

标签: python loops merge logic

我有这两个列表

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

3 个答案:

答案 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]]