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方法是什么?
我认为执行此操作的规范的、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)
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |