在Python中将子列表结构复制到另一个等长列表

2024-04-19 09:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一张单子

list1 = ['Dog', 'Cat', 'Monkey', 'Parakeet', 'Zebra']

还有一个

^{pr2}$

(可以想象第二个列表是用itertools.groupby动物成为家庭宠物。)

现在假设我要给第一个列表提供与第二个相同的子列表结构。在

list3 = [['Dog', 'Cat'], ['Monkey'], ['Parakeet'], ['Zebra']]

我可以这样做:

list3 = []
lengths = [len(x) for x in list2]
count = 0
for leng in lengths:
    templist = []
    for i in range(leng):   
        templist.append(list1[count])
        count += 1
    list3.append(templist)

我还没有完全调试过,但我觉得应该行得通。我的问题是,有没有一种更像Python或更简单的方法来做到这一点?这看起来有点复杂,我不得不想象有一种更优雅的方式来实现它(也许在itertools中,它永远不会停止给我留下深刻的印象)。在


Tags: in列表forcountcatmonkeyitertoolsdog
3条回答

list1iter和{}作为每个列表2的必要N个元素,例如:

from itertools import islice

list1 = ['Dog', 'Cat', 'Monkey', 'Parakeet', 'Zebra']
list2 = [[True, True], [False], [True], [False]]

it = iter(list1)
list3 = [list(islice(it, len(el))) for el in list2]
# [['Dog', 'Cat'], ['Monkey'], ['Parakeet'], ['Zebra']]

您只需将next用于无导入解决方案:

list1 = ['Dog', 'Cat', 'Monkey', 'Parakeet', 'Zebra']
list_1 = iter(list1)
list2 = [[True, True], [False], [True], [False]]
new_list2 = [[next(list_1) for _ in i] for i in list2]

输出:

^{pr2}$

但是,对于深度输入n级别,可以使用递归:

list1 = ['Dog', 'Cat', 'Monkey', 'Parakeet', 'Zebra']
list_1 = iter(list1)
list2 = [[True, [True, False]], [False], [[True]]]
def place_data(current):
   return [next(list_1) if isinstance(i, int) else place_data(i) for i in current]

print(place_data(list2))

输出:

[['Dog', ['Cat', 'Monkey']], ['Parakeet'], [['Zebra']]]

如果您可以修改原始列表(如果不介意,您可以先复制),您可以在列表理解中使用pop()

list1 = ['Dog', 'Cat', 'Monkey', 'Parakeet', 'Zebra']
list2 = [[True, True], [False], [True], [False]]

list3 = [[list1.pop(0) for j in range(len(x))] for x in list2]
print(list3)
#[['Dog', 'Cat'], ['Monkey'], ['Parakeet'], ['Zebra']]

相关问题 更多 >