根据索引从两个列表中制作列表列表

Posted

技术标签:

【中文标题】根据索引从两个列表中制作列表列表【英文标题】:Making a list of lists from two lists based on indexes 【发布时间】:2018-05-06 16:46:32 【问题描述】:

我有这两个列表

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, 2, 3], [0, 1], [2, 3, 0, 1], [2, 3, 0, 1, 2, 3]],这与相关列表不同。你到底想要什么? 你说得对! 与其他问题非常相似。请特别查看此答案:***.com/a/312467/560599 - 不难将其概括为尺寸列表。 【参考方案1】:

您可以将 list comprehension 表达式与list slicing 一起使用为:

>>> indexes = [4, 2, 4, 6]
>>> values = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]

>>> [values[sum(indexes[:i]):sum(indexes[:i+1])] for i, index in enumerate(indexes)]
[[0, 1, 2, 3], [0, 1], [2, 3, 0, 1], [2, 3, 0, 1, 2, 3]]

【讨论】:

这是完美的。谢谢。 @chribis : 你在写问题时应该小心,一旦你得到答案,你不应该改变问题的基本要求。它将现有答案标记为无效答案。例如:我刚投了两票,因为你改变了你的问题:/ PS:我已经更新了答案以匹配你想要的结果 很抱歉,@Moinuddin。我的错。我接受了你的回答。 我很感激,但接受答案并不是道歉。在最初编写问题时,您需要小心。理想情况下,我应该将您的问题回滚到以前的版本。但既然你是新来的,我想你不知道,以后会小心的:)【参考方案2】:
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]]

【讨论】:

【参考方案3】:

常规的 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]]

【讨论】:

以上是关于根据索引从两个列表中制作列表列表的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个列表元素获取一些列表元素索引

Pandas - 根据另一个列表中的索引对列表中的值求和

使用 Counter 对象从两个列表中创建字典

使用 Linq 合并两个列表,并根据需要从不同的表中添加数据

Python-组合两个列表以制作列表列表[重复]

如何有效地找到两个列表中匹配元素的索引