将连续重复项变为一个值(Python)

Posted

技术标签:

【中文标题】将连续重复项变为一个值(Python)【英文标题】:Change consecutive duplicates into one value (Python) 【发布时间】:2022-01-14 05:00:00 【问题描述】:

我在删除列表中的连续重复项而不删除所有重复项时遇到问题。

假设我有一个清单,

a = [3,3,3,4,10,11,3,3,5,5,10]

我想要做的是,只要一行中有重复项,该重复项就会更改为单个值。我希望这发生在任意数量的连续重复中。因此,我希望我的新 a 成为,

new_a = [3,4,10,11,3,5,10]

请注意,我不想像 set 函数那样删除其他重复项,我只想将连续重复项更改为一个值。

这是我的尝试,它有时有效,但不适用于我的所有列表,很可能是因为我不确定如何为我的范围设置一般规则。

for i in range(0, len(set(a))-1):
    if a[i] == a[i+1]:    
          a.pop(i+1)

任何帮助都会很棒,谢谢。

【问题讨论】:

【参考方案1】:
This might help
a=[3,3,4,10,11,3,5,5,0,0,10,11,11,10,10,0,0]
i=0
while(i<(len(a)-1)):
        if a[i]==a[i+1]:    
          a.pop(i+1)
        i+=1
print(a)

【讨论】:

【参考方案2】:
a = [3,3,3,4,10,11,3,3,5,5,10]

new_a = []
for i in range(len(a)):
    if a[i] != a[i-1]:
        new_a.append(a[i])
print(new_a)

[3, 4, 10, 11, 3, 5, 10]

【讨论】:

【参考方案3】:

您可以在迭代列表时跟踪最后一个项目,并仅在当前项目与最后看到的项目不同时将其附加到结果中。

在代码方面,

def solve(l):
    seen = l[0]
    ans = [l[0]]
    for i in l[1:]:
        if i != seen:
            ans += [i]
            seen = i
    return ans

solve([1, 1, 1, 2, 1])
[1, 2, 1]
solve([3,3,3,4,10,11,3,3,5,5,10])
[3, 4, 10, 11, 3, 5, 10]

【讨论】:

【参考方案4】:

你可以这样做:

a = [3,3,3,4,10,11,3,3,5,5,10]
b = [a[0]]
for x in a[1:]:
    if x != b[-1]:
        b.append(x)
print(b)

当然,这会创建一个新列表,因此您可以将 a 替换为 b

【讨论】:

【参考方案5】:

这对你有帮助吗?

mylist = ["a", "b", "a", "c", "c"]
mylist = list(dict.fromkeys(mylist))

【讨论】:

【参考方案6】:

你可以使用numpy.ediff1d方法:

np.array(a)[np.concatenate(([1],np.ediff1d(a)))!=0].tolist()

输出:

[ 3,  4, 10, 11,  3,  5, 10]

【讨论】:

以上是关于将连续重复项变为一个值(Python)的主要内容,如果未能解决你的问题,请参考以下文章

从Python中的嵌套列表中删除连续的重复项?

从 2D 列表中删除连续重复项,python?

将某些值连续汇总[重复]

替换 2D numpy 数组中的连续重复项

python 将连续变量Bin变为离散级别 - Telco数据集

Python当中的array数组对象