📅  最后修改于: 2023-12-03 15:19:19.733000             🧑  作者: Mango
当对一个列表进行操作时,我们有时候需要将中断位置的元素进行分组处理。比如,我们有一个列表 [1, 2, None, 3, None, 4, 5, None],我们需要把其中的元素分成三组,[1, 2], [3], [4, 5],则可以通过以下方法实现。
data = [1, 2, None, 3, None, 4, 5, None]
res = [list(group) for k, group in itertools.groupby(data, lambda x: x is None) if not k]
print(res)
# Output: [[1, 2], [3], [4, 5]]
在上面的代码中,我们使用了 itertools.groupby
方法,它可以将列表中连续的满足某个条件(这里是元素是否为 None)的元素分成一组。然后我们使用列表推导式将非空组装入列表返回。
data = [1, 2, None, 3, None, 4, 5, None]
groups = []
tmp = []
for value in data:
if value is None:
if tmp:
groups.append(tmp)
tmp = []
else:
tmp.append(value)
if tmp:
groups.append(tmp)
print(groups)
# Output: [[1, 2], [3], [4, 5]]
上面的代码是通过一个 for 循环来实现的,我们定义了一个空的列表用来存储分组后的元素,然后逐个元素遍历原列表,将连续的非 None 元素放在一个临时列表中,直到遇到 None 元素,将临时列表存入分组列表,清空临时列表,继续遍历。最后将最后一个临时列表存入分组列表返回。
data = [1, 2, None, 3, None, 4, 5, None]
groups = []
i = 0
while i < len(data):
if data[i] is None:
i += 1
else:
j = i + 1
while j < len(data) and data[j] is not None:
j += 1
groups.append(data[i:j])
i = j
print(groups)
# Output: [[1, 2], [3], [4, 5]]
与 for 循环类似,这里我们也是逐个元素遍历原列表,不同之处在于我们使用了 while 循环,并且采用了双指针法来寻找连续的非 None 元素,并将其存入分组列表中。
无论是列表推导式,for 循环还是 while 循环,都能够实现对中断位置的元素进行分组。根据不同的需求,选择不同的方法即可。