【问题标题】:Incremental duplicates增量重复
【发布时间】:2022-01-17 04:03:31
【问题描述】:

我有一个整数列表,这个列表是循环的。我想找到连续的重复项,而不是将重复号 + 1 放在起始位置。也需要这样做,直到列表中没有连续的重复项或列表为空。我尝试了不同形式的 while 循环,但无法达到我的目标。尝试使用 itertools.cycle 循环,因为 -1 和 0 也是连续的,但无法删除或插入。还找出何时停止是问题,尝试int_list == list(set(int_list)) 但可能有一些不连续的重复,从而创建一个无限循环。这是一个例子:

int_list = [1,1,1,2,3,4,5,6,7,7,8,8,9,10,8,11,4,12,15,13,14,14,15,16,1]
processed_list = [11,8,11,4,12,15,13,17]

编辑:

原来的问题在this Codewars kata。

【问题讨论】:

  • 写一个判断是否有连续重复的函数。然后你可以做while there_are_duplicates(int_list):
  • 或者您可以使用一个变量来记录您是否对列表进行了任何修改。如果你通过列表​​而不做任何替换,你就会跳出主循环。
  • 我试图创建一个 bool 函数来检测重复,但列表是循环的,所以我找不到检测它的方法。
  • Python 没有循环列表。你只需要额外检查一下int_list[0] == int_list[-1]
  • 我知道,但是减去索引会创建一个循环列表错觉。有一些边缘情况,比如所有项目都可能相同。我试图用循环创建一个函数,但正如我提到的,我找不到方法。

标签: python python-3.x list duplicates


【解决方案1】:

deque 接近于循环列表,因为它允许旋转列表。我在下面的代码中利用了这一点。

该算法将 item[0] 与下一个项目 item[1] 以及前一个项目(在循环意义上)item[-1] 进行比较,丢弃所有重复项并增加原始 item[0](如果发现任何重复项)。

如果没有找到重复项,则轮换列表并使用新的item[0] 重复该过程。

如果有一个完整长度的列表轮换但没有找到一个副本,则该过程停止。

# Version 3

from collections import deque

def process(inp):
    circ = deque(inp)
    rcnt = 0    # rotations without finding a dup
    while rcnt < len(circ):
        n = circ[0]
        isdup = False
        while len(circ) >= 1 and circ[1] == n:
            isdup = True
            circ.popleft()
        while len(circ) >= 1 and circ[-1] == n:
            isdup = True
            circ.pop()
        if isdup:
            circ[0] = n+1
            rcnt = 0
        else:
            circ.rotate(1)
            rcnt += 1
        # print(list(circ)) # uncomment to watch the progress
    return list(circ)

test = [1,1,1,2,3,4,5,6,7,7,8,8,9,10,8,11,4,12,15,13,14,14,15,16,1]
print(process(test))

带有未注释的调试print:

[2, 2, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[4, 4, 5, 6, 7, 7, 8, 8, 9, 10, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[5, 5, 6, 7, 7, 8, 8, 9, 10, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[6, 6, 7, 7, 8, 8, 9, 10, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[7, 7, 7, 8, 8, 9, 10, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[8, 8, 8, 9, 10, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[9, 9, 10, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[10, 10, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[11, 8, 11, 4, 12, 15, 13, 14, 14, 15, 16]
[16, 11, 8, 11, 4, 12, 15, 13, 14, 14, 15]
[15, 16, 11, 8, 11, 4, 12, 15, 13, 14, 14]
[14, 15, 16, 11, 8, 11, 4, 12, 15, 13, 14]
[15, 15, 16, 11, 8, 11, 4, 12, 15, 13]
[16, 16, 11, 8, 11, 4, 12, 15, 13]
[17, 11, 8, 11, 4, 12, 15, 13]
[13, 17, 11, 8, 11, 4, 12, 15]
[15, 13, 17, 11, 8, 11, 4, 12]
[12, 15, 13, 17, 11, 8, 11, 4]
[4, 12, 15, 13, 17, 11, 8, 11]
[11, 4, 12, 15, 13, 17, 11, 8]
[8, 11, 4, 12, 15, 13, 17, 11]
[11, 8, 11, 4, 12, 15, 13, 17]
[17, 11, 8, 11, 4, 12, 15, 13]
[13, 17, 11, 8, 11, 4, 12, 15]

the last line is the result:
[13, 17, 11, 8, 11, 4, 12, 15] 

【讨论】:

  • 感谢您的回复。但仍然存在索引问题。当输入为 [7,5,5,6,8,9,10,12,10,8] 时,返回 [7, 8, 9, 10, 12, 10, 8, 7]。
  • @ÜmitKara 感谢您的反馈。循环迭代次数太少。给我一点时间分析,我会改正的。
  • @ÜmitKara 我已经更新了循环条件,希望问题得到解决。
  • 谢谢,干得好。我不知道'finally'关键字,这会浪费很多时间。
  • 我很高兴能帮上忙,这里finally 可以用适当的长度检查代替,以避免IndexError,而且我正在看它也会更好恕我直言。我会在最后一次更新它。
猜你喜欢
  • 2014-12-09
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多