【问题标题】:Flocculating data in Python在 Python 中聚集数据
【发布时间】:2017-06-15 23:57:36
【问题描述】:

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

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

[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]

【问题讨论】:

  • 稍后重复一组数字的输入的正确输出是什么?例如[1, 4, 4, 2, 0, 3, 3, 3, 1, 1, 4, 2, 0, 0, 8, 3, 3, 0]
  • 当你得到解决方案时,请记得给有用的东西投票并接受你最喜欢的答案(即使你必须自己写),这样 Stack Overflow 才能正确存档问题。跨度>
  • 哟@Prune,你得到了我的支持!我只是还没有足够的 stackoverflow 街道信誉来公开展示我的选票。无论如何,这就是stackoverflow告诉我的。实际上,每个答案都以自己的方式非常愚蠢。你的,因为它简单而优雅。 d-gillis 指出我原始代码中的缺陷。还有 peter-de-rivaz 以四票全票指出了似乎是典型的 python 聚集一些数据的方式。谢谢大家,你摇滚

标签: python algorithm chunking


【解决方案1】:

我想你可能正在寻找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]

【讨论】:

    【解决方案2】:

    我删除了我原来的答案;我终于在这种情况下理解了“絮凝”。抱歉……我被陶瓷行业蒙蔽了几年。

    你会做太多的工作,标记匹配或不匹配的东西。只需从原始列表中构建一个新列表。仅添加与前一个匹配的项目。

    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]
    

    【讨论】:

    • 哇,比我要走的路线简单多了。如果有人知道这种算法的更合适的术语,请让我们都知道。因为谷歌搜索“絮凝算法”非常无用!
    【解决方案3】:

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


    代码中的错误是由于 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]
    

    【讨论】:

      猜你喜欢
      • 2018-06-19
      • 2021-06-05
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2014-10-08
      • 2017-07-31
      相关资源
      最近更新 更多