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

sfo*_*ney 10 python list

说我有一个清单,

list1 = ['Dog', 'Cat', 'Monkey', 'Parakeet', 'Zebra']
Run Code Online (Sandbox Code Playgroud)

而另一个,

list2 = [[True, True], [False], [True], [False]]
Run Code Online (Sandbox Code Playgroud)

(你可以想象第二个列表是用动物作为家养宠物的itertools.groupby创建的.)

现在说我想给第一个列表提供与第二个列表相同的子列表结构.

list3 = [['Dog', 'Cat'], ['Monkey'], ['Parakeet'], ['Zebra']]
Run Code Online (Sandbox Code Playgroud)

我可能会这样做:

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)
Run Code Online (Sandbox Code Playgroud)

我没有完全调试,但我认为应该工作.我的问题是,是否有更多的pythonic或简单的方法来做到这一点?这似乎有点令人费解,我不得不想象有一种更优雅的方式来做这件事(也许是在永远不会给我留下深刻印象的itertools).

Aja*_*234 11

您可以简单地使用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]
Run Code Online (Sandbox Code Playgroud)

输出:

[['Dog', 'Cat'], ['Monkey'], ['Parakeet'], ['Zebra']]
Run Code Online (Sandbox Code Playgroud)

但是,对于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))
Run Code Online (Sandbox Code Playgroud)

输出:

[['Dog', ['Cat', 'Monkey']], ['Parakeet'], [['Zebra']]]
Run Code Online (Sandbox Code Playgroud)

  • 我正准备用这个提交一个编辑到我的答案......我现在不会...... :) (3认同)

pau*_*ult 1

如果您可以修改原始列表(如果不能,您始终可以先复制),则可以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']]
Run Code Online (Sandbox Code Playgroud)

  • @sfortney 只是要小心,列表前面的弹出并不是特别快,并且“list1”会发生变化 - 所以请确保您不需要它之后或任何其他引用它的东西,因为它会是空的。 (6认同)