Python发现重复出现超过3次

时间:2019-01-24 14:48:41

标签: python list

我正在尝试找到一种有效的方法来搜索三个或更多连续的重复项,并将其替换为Python列表中的一个。

Request.Properties["totalResults"]

这里似乎是什么问题?有没有更有效的方法?

6 个答案:

答案 0 :(得分:10)

我是itertools.groupby的好用例:

>>> from itertools import groupby
>>> list_before = [1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8]
>>> list_after = []
>>> for k, group in groupby(list_before):
...     lst = list(group)
...     if len(lst) >= 3:
...         list_after.append(k)
...     else:
...         list_after.extend(lst)
>>> list_after
[1, 2, 3, 4, 5, 6, 6, 7, 8]

使用itertools.chain可以实现单线,但是for循环几乎可以肯定更具可读性和类似的性能。

答案 1 :(得分:2)

>>> from itertools import groupby
>>> nums = [1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8]
>>> [k for k, g in groupby(nums) for i in range(1 + (len(list(g)) == 2))] 
[1, 2, 3, 4, 5, 6, 6, 7, 8]

答案 2 :(得分:1)

正如克里斯在回答中所指出的,单线是可能的,但一点也不漂亮。

In [88]: list(chain.from_iterable([(x,) if len(y) >= 3 else y for x, y in [(k, tuple(g)) for k, g in groupby(list_before)]]))
Out[88]: [1, 2, 3, 4, 5, 6, 6, 7, 8]

我认为应该有一个更好的方法,但是chain足够聪明,可以处理不可迭代的对象。

答案 3 :(得分:0)

只需添加我在流上使用的面向对象的方法即可:

input_values = [1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8]
StreamCount(input_values).process_all()

测试

input_values = []
  

输出:   [1、2、3、4、5、6、6、7、8]

input_values = [None]
  

输出:   []

qsort_r()
  

输出:   [无]

答案 4 :(得分:0)

尝试这种方式,定义一个自定义方法以根据条件对数组进行切片:

def take_max_three(iterable):
  iterable = sorted(iterable) # It requires the iterable to be sorted, remove if already sorted
  i, x, size = 0, 0, len(iterable)
  while i < size-1:
    if iterable[i] < iterable[i+1]:
      ready = iterable[x:i+1]
      if len(ready) <= 3:
        yield ready
      else:
        yield ready[0:3]
      x = i + 1
    i += 1
  yield iterable[x:x+3]

然后只需在数组上调用方法,这是一个经过稍微修改的数组:

array = [1, 1, 2, 3, 4, 5, 5, 1, 5, 6, 6, 6, 7, 3, 7, 7, 8, 8, 8, 8, 8, 9]
take_max_three(array)
# => [[1, 1, 1], [2], [3, 3], [4], [5, 5, 5], [6, 6, 6], [7, 7, 7], [8, 8, 8], [9]]

您可以进一步自定义传递要获取的元素数量的方法。

答案 5 :(得分:-2)

这是我的解决方案:

list_before = [1, 5, 7, 8, 6, 1, 4, 5, 6, 7, 1, 8, 8, 5, 2, 3, 7, 8, 8]

list_after = []
for item in list_before:
    if not item in list_after:
        list_after.append(item)