说我有一个清单,
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)
如果您可以修改原始列表(如果不能,您始终可以先复制),则可以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)
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |