代码之家  ›  专栏  ›  技术社区  ›  user2995603

数组中相似项的序列

  •  0
  • user2995603  · 技术社区  · 7 年前

    我第一次使用Python,我需要找到一种有效的方法来搜索由三个、四个或五个元素组成的连续序列在更大的数组中是否相同。

    例如:

    array = [1, 0, 0, 0, 1]
    

    输出:

    number_same = 3
    element = 0
    positions = [1, 2, 3]
    

    有什么建议或帮助吗?

    谢谢!

    4 回复  |  直到 7 年前
        1
  •  3
  •   Uri Hoenig    7 年前

    下一行将提供值的元组列表及其在数组中的位置(按重复分组):

    from itertools import groupby
    [(k, [x[0] for x in g]) for k, g in groupby(enumerate(array), lambda x: x[1])]
    >>> [(1, [0]), (0, [1, 2, 3]), (1, [4])]
    

    您可以稍后对其进行过滤,以仅获得3次及以上的重复次数:

    filter(lambda x: len(x[1])>2, grouped_array)
    

    使用以下答案作为参考: What's the most Pythonic way to identify consecutive duplicates in a list?

        2
  •  0
  •   GrepGrep    7 年前

    我对Python不太熟悉,但我不认为有内置函数可以实现这一点。

    您可以遍历列表并使用第二个数组作为计数器。

    i、 e.如果位置0中的数字是1,则将1添加到第二个数组中的位置1

    original_array = [1, 0, 0, 0, 1]
    second_array_after_populating = [3, 2, 0, 0, 0]
    

    然后你只需扫描列表一次,就可以找到最常见的数字,以及其中的多少。一旦你知道了号码,你就可以浏览原始列表,找到它出现的位置。

        3
  •  0
  •   The Pjot    7 年前

    Counter 上课对你很有用。

    from collections import Counter
    array = [1, 0, 0, 0, 1]
    counter = Counter(array)
    mc = counter.most_common(20)
    print(mc)
    
    # [(0, 3), (1, 2)]
    most_common = mc[0][0] #  = 0
    number_same = mc[0][1] #  = 3
    positions = [i for i, x in enumerate(array) if x == most_common]
    

    最后一行来自此 SO post .

        4
  •  0
  •   E. Ducateme    7 年前

    这不是一个完整的答案,但这是一个开始。

    这使用了 groupby() 与关联的方法 itertools 图书馆这个 groupby() 方法寻找连续的值组(与真正的值组相反),因此它非常适合寻找序列。

    array = [1, 0, 0, 0, 1]
    
    from itertools import groupby
    
    g = groupby(array)
    for value, grp in g:
    

    grp 是迭代器。。。我们可以通过使用 list() 函数将值提取到列表中。

        grp = list(grp)
        length = len(grp)
    

    这个 if 语句使用 in 是检查各种值的方便方法。

        if length in [3, 4, 5]:
            print('number_same =', length)
            print('element =', value)
            print('positions =', 'still working on this')
    
    ==== OUTPUT ====
    number_same = 3
    element = 0
    positions = still working on this