我正在尝试找到一种有效的方法来搜索三个或更多连续的重复项,并将其替换为Python列表中的一个。
Request.Properties["totalResults"]
这里似乎是什么问题?有没有更有效的方法?
答案 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)