在Python中解压缩给定数量的项目?

Ano*_*ous 5 python iterable-unpacking

有没有办法使用'splat'运算符(例如a, *rest = somelist)以消耗一定数量的项目?

使用案例:我想将一些输入分成一个数字,一个列表列表,另一个数字和另一个列表列表.

我的输入如下:

5
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
5
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Run Code Online (Sandbox Code Playgroud)

而我想的名字first_num,first_arrangement,second_num,second_arrangement使得:

first_num == 5
first_arrangement == [[1, 2, 3, 4], [5, 6, 7, 8], ...]
Run Code Online (Sandbox Code Playgroud)

等等.

要做到这一点,能够从我已经产生线的迭代中消耗一定数量的项是有用的.像这样的东西作为中间步骤是理想的: first_num, *[4]first_arrangement, second_num, *[4]second_arrangement = lines

解决这个问题的正常/规范/ Pythonic方法是什么?

jme*_*jme 2

我认为执行此操作的规范的、Pythonic 的方法是将责任放在您正在迭代的生成器上。我会像这样定义一个生成器函数:

import itertools

def generate_arrangements(iterable, size=4):
    iterator = iter(iterable)
    while True:
        yield next(iterator)
        yield list(list(row) for row in itertools.islice(iterator, size))
Run Code Online (Sandbox Code Playgroud)

假设您的数据位于如下列表中:

data = [
    5,
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14, 15, 16],
    5,
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14, 15, 16]
]
Run Code Online (Sandbox Code Playgroud)

然后写:

first_num, first_arr, second_num, second_arr = generate_arrangements(data)
Run Code Online (Sandbox Code Playgroud)

给你你想要的输出:

>>> first_num
5
>>> first_arr
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
Run Code Online (Sandbox Code Playgroud)

您还可以同时生成数量和排列,并让用户进行一些额外的拆包,这可能是更自然的方法:

import itertools

def generate_arrangements(iterable):
    iterator = iter(iterable)
    while True:
        number =  next(iterator)
        arrangement = list(list(row) for row in itertools.islice(iterator, 4))
        yield number, arrangement

(first_num, first_arr), (second_num, second_arr) = generate_arrangements(data)
Run Code Online (Sandbox Code Playgroud)

正如 @JoranBeasley 在评论中所写,这种形式使得在 for 循环中使用元组解包变得很容易,如下所示:

for num,arr in generate_arrangements(data):
    print(num) 
    print(arr)
Run Code Online (Sandbox Code Playgroud)