Python 中的絮凝数据

Flocculating data in Python

我正在努力寻找我的絮凝功能的错误。

该函数的目标是获取一个列表并将每组连续值分块为单个值。例如...

[1, 4, 4, 2, 0, 3, 3, 3] => [1, 4, 2, 0, 3]

现在的功能是...

def flocculate(array):
    for index1, val1 in enumerate(array):
        if val1 == 0 or not not val1:
            new_array = array[index1+1:]
            for index2, val2 in enumerate(new_array):
                if array[index1] == val2:
                    array[index1 + index2 + 1] = False
                else:
                    break
    return [value for value in array if type(value) is not bool]

但是,它似乎不能很好地处理零。

例如,下面显示的输入正确了一些零,但遗漏了其他一些...

[2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0] => [2, 4, 3, 7, 0, 2, 8, 0]

我删除了原来的答案;我终于在这个语境下理解了"flocculate"。不好意思。。。我被陶瓷多年蒙蔽了双眼。

您将做太多工作,标记匹配或不匹配的内容。简单地从原始列表构建一个新列表。只添加 匹配前一个的项目。

test_list = [
    [1, 4, 4, 2, 0, 3, 3, 3],
    [2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0],
    [-122, 4, 14, 0, 3, 7, 0, 2, 2, -2, 8, 0, 0, 0, 9999]
]

def flocculate(array):
#    return list(set(array))
    result = []
    last = None
    for i in array:
        if i != last:
            result.append(i)
            last = i
    return result

for array in test_list:
    print array, "\n    =>", flocculate(array)

输出:

[1, 4, 4, 2, 0, 3, 3, 3] 
    => [1, 4, 2, 0, 3]
[2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0] 
    => [2, 4, 0, 3, 7, 0, 2, 8, 0]
[-122, 4, 14, 0, 3, 7, 0, 2, 2, -2, 8, 0, 0, 0, 9999] 
    => [-122, 4, 14, 0, 3, 7, 0, 2, -2, 8, 0, 9999]

将您的第一个 if 语句更改为 if val1 is not False: 可以解决问题。也就是说,我强烈建议您改用 。将列表中的每个元素与前一个元素进行比较的方法要简单得多。 (而且它还具有不改变输入列表的优点。)


您的代码中的错误是由于 False == 0 在 Python 中被计算为 True 造成的。这会导致您的函数出现两个问题。第一个是 if 块中的代码将为列表中的每个元素 运行,即使您已经将该元素标记为 False。这导致了第二个问题:False 元素之后的任何 0 值都将被视为应该丢弃的连续相等值(因为 False == 0)。因此,只要你有一个 0 跟随连续的相等元素,这个 0 就会变成 False,因此不会出现在输出列表中。

作为一个简短的例子,下面是输入 [2, 4, 4, 0] 函数每次迭代开始时列表的样子(其中“>”表示当前索引)。

Input: [2, 4, 4, 0]
[>2, 4, 4, 0]
[2, >4, 4, 0]
[2, 4, >False, 0]
[2, 4, False, >False]
Output: [2, 4]

我想您可能正在寻找 itertools.groupby

此函数收集相似项(由可选键函数定义的相似性)。

例如:

import itertools

def flocculate(A):
    return [k for k,g in itertools.groupby(A)]

print flocculate([2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0])
print flocculate([1, 4, 4, 2, 0, 3, 3, 3])

打印:

[2, 4, 0, 3, 7, 0, 2, 8, 0]
[1, 4, 2, 0, 3]