【问题标题】:Remove cycle/repetition from list python从列表python中删除循环/重复
【发布时间】:2021-11-28 02:53:43
【问题描述】:

我有一个值列表,其中可能包含或不包含某些元素循环。 我已经编写了下面的代码来提取列表中重复的值的索引和长度。我的问题是我现在有多个重复的值的索引和长度。如何从主列表中删除这些元素以删除这些循环

data = [1,2,3,1,2,3,4,5,6,7,4,5,6,7,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,23,18]
minrun = 1
lendata = len(data)

for runlen in range(minrun, lendata // 2):
    i = 0
    while i < lendata - runlen * 2:
#         print("i",i)
#         print("runlen", runlen)
#         print(lendata - runlen * 2)
        s1 = data[i:i + runlen]
#         print("s1",s1)
        s2 = data[i + runlen:i + runlen * 2]
#         print("s2",s2)
        if s1 == s2:
            print(i, runlen, s1)
            i += runlen 
        else:
            i += 1

有没有更好的方法来做到这一点?

【问题讨论】:

  • 你对周期的确切定义是什么?
  • 在我共享的数据中,值为 1,2,3,1,2,3.. 这是一个循环/重复.. 我只想保留一个这样的序列.. 4, 5,6,7不断重复3次..我只想保留一次
  • 1, 1, 1 被认为是一个循环吗?您正在考虑的最小周期长度是多少?如果你有1, 2, 1, 2,然后在序列1, 2, 1, 2, 1的后面,是循环1, 2, 1还是1, 2
  • 最小循环长度为2。所以我想解决的想法是..如果我有1,2,1,2..我想消除1,2..我显示的代码检查不同长度的列表..如果您运行代码,它将给出不同的索引..我的问题是,如果索引重叠怎么办..如何删除它
  • 听起来,我认为递归会更好。首先删除任何重复的 2 长度循环,然后再次检查 2 循环(因为删除一个循环可能会创建另一个循环)。重复直到不再找到 2 个循环。然后继续进行 3 个循环。一样。最后,如果检查了n / 2-length 循环但没有找到,则返回。公平警告:我没有测试过这个理论。编辑:实际上删除任何 n 循环可能会创建一个重复循环,所以我认为任何时候删除一个循环,你都需要从 2 个循环重新开始。

标签: python list cycle


【解决方案1】:

这可以工作,但我没有测试其他序列,我只是为你的例子测试了它。

data = [1,2,3,1,2,3,4,5,6,7,4,5,6,7,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,23,18]
print(data)

checkindex = []
for j in range(1, len(data)):
    for k in range(len(data)):
        try:
            if data[k] == data[j+k]:
                if j+k not in checkindex:
                    checkindex.append(j+k)  
        except IndexError:
            continue
checkindex = sorted(checkindex)
for i in range(len(checkindex)-1, -1, -1):
    del data[checkindex[i]]
print(data)

输出:

[1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 23, 18]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 23, 18]

解释:

for k in range(len(data)):
    if data[i+k] == data[j+k]:

例如对于j=3,基本上是这样的:

data[0] == data[3+0]: True
data[1] == data[3+1]: True
data[2] == data[3+2]: True
data[3] == data[3+3]: False

对于每个True,附加(j+k) --> 如果它不重复。我建议尝试在这里和那里打印以了解更多信息,例如:

data = [1,2,3,1,2,3,4,5,6,7,4,5,6,7,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,23,18]
print(data)

checkindex = []
for j in range(1, len(data)):
    for k in range(len(data)):
        try:
            if data[k] == data[j+k]:
                print(j, k, j+k)
                if j+k not in checkindex:
                    checkindex.append(j+k)  
        except IndexError:
            continue
    print(checkindex)
checkindex = sorted(checkindex)
for i in range(len(checkindex)-1, -1, -1):
    del data[checkindex[i]]
print(data)

您的输出将是:

[1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 23, 18]
[]
[]
3 0 3
3 1 4
3 2 5
[3, 4, 5]
4 6 10
4 7 11
4 8 12
4 9 13
4 10 14
4 11 15
4 12 16
4 13 17
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17]
8 6 14
8 7 15
8 8 16
8 9 17
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17]
10 14 24
10 15 25
10 16 26
10 17 27
10 18 28
10 19 29
10 20 30
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30]
14 10 24
14 11 25
14 12 26
14 13 27
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30]
18 3 21
18 4 22
18 5 23
18 6 24
18 7 25
18 8 26
18 9 27
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
21 0 21
21 1 22
21 2 23
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 23, 18]

我个人认为打印语句有助于我理解更多。

【讨论】:

  • 你能解释一下'try'子句中的概念吗
  • 我用更多解释更新了我的答案。如果还有不清楚的地方再问。
猜你喜欢
  • 2011-11-05
  • 2018-04-02
  • 2011-07-21
  • 2021-10-12
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
相关资源
最近更新 更多