删除Julia中的连续重复项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除Julia中的连续重复项相关的知识,希望对你有一定的参考价值。

我是朱莉娅的新手,我不知道如何删除数组中的连续重复项。例如,如果您采用此数组:

   `v=[8,8,8,9,5,5,8,8,1];`

我想获得向量v1,使得:

v1 = [8,9,5,8,1];

谁能帮助我?非常感谢。

答案

一种方法可以是定义:

function fastuniq(v)
  v1 = Vector{eltype(v)}()
  if length(v)>0
    laste = v[1]
    push!(v1,laste)
    for e in v
      if e != laste
        laste = e
        push!(v1,laste)
      end
    end
  end
  return v1
end

使用此功能,您可以:

julia> println(fastuniq(v))
[8,9,5,8,1]

但是,在处理数组时,需要确定元素是深层还是浅层复制。在整数的情况下,没关系。

另一答案

StatsBase.jl中有一个rle函数(运行长度编码)就是这样做的。

另一答案

这比@DanGetz的功能慢很多,但这是一种方法:

function notsofastunique(v)
  return [v[1]; v[2:end][v[2:end] .!= v[1:end-1]]]
end


>println(notsofastunique(v))
[8,9,5,8,1]

也许这对寻找一个软件解决方案的人来说很有用。

另一答案

在精神@ niczky12单线解决方案目标中,以下使用Iterators.jl包(非常有用且慢慢迁移到Base)。

using Iterators           # install with Pkg.add("Iterators")

neatuniq(v) = map(first,filter(p->p[1]!=p[2],partition(chain(v,[nothing]),2,1)))

没有做任何基准测试,但它应该没问题(但比基于for的更长的功能慢)。

另一答案

只是为了练习...

这是您可以用来执行此操作的另一个小函数,此函数仅适用于非负值(包括0)。

function anotherone(v)
    v1 = zeros(eltype(v),length(v))
    v1[1]=v[1]+1
    for e = 2:length(v)
        if v[e] != v[e-1]
            v1[e] = v[e]+1    
        end
    end
    return v1[find(v1)]-1
end

编辑:

根据评论中的输入添加一个版本。我认为这个应该更快,也许你可以测试一下:)这个版本也适用于负数。

function anotherone(v)
    v1 = falses(length(v))
    v1[1]=true
    for e = 2:length(v)
        if v[e] != v[e-1]
            v1[e] = true    
        end
    end
    return v[v1]
end

以上是关于删除Julia中的连续重复项的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 RLE 删除每行的连续重复项并检查 R 中的序列逻辑

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

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

如何删除已经在list中的重复项

如何删除字符串中的重复项