📜  Python|对列表中中断位置的元素进行分组(1)

📅  最后修改于: 2023-12-03 15:19:19.733000             🧑  作者: Mango

Python | 对列表中中断位置的元素进行分组

当对一个列表进行操作时,我们有时候需要将中断位置的元素进行分组处理。比如,我们有一个列表 [1, 2, None, 3, None, 4, 5, None],我们需要把其中的元素分成三组,[1, 2], [3], [4, 5],则可以通过以下方法实现。

1. 列表推导式
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)的元素分成一组。然后我们使用列表推导式将非空组装入列表返回。

2. for 循环
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 元素,将临时列表存入分组列表,清空临时列表,继续遍历。最后将最后一个临时列表存入分组列表返回。

3. while 循环
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 循环,都能够实现对中断位置的元素进行分组。根据不同的需求,选择不同的方法即可。