【问题标题】:What's an elegant way to return a list without the nth element?返回没有第 n 个元素的列表的优雅方法是什么?
【发布时间】:2022-08-10 02:31:14
【问题描述】:

什么是返回没有第 n 个元素的列表的优雅而有效的方法? 我现在正在使用类似的东西:

my @b = @a;
@b.splice($n,1);
return @b;

但这不是很优雅,也可能效率不高。

(像return @b.spliced($n,1) 这样的东西会更好,但这不起作用。)

return flat @a[0..^$n,$n^..*]

也好不到哪里去。

  • 我想看到一个.isplice 方法(不可变拼接),所以你可以去``` @a.isplice($n,1)``` 并且它会返回结果而保持@a 不变。
  • @p6steve,这就是我试图用@b.spliced($n,1) 建议的...

标签: raku


【解决方案1】:

除了你描述的方法,我不知道还有其他方法。

我一直在考虑将.skip 方法扩展到多个参数,这将允许@b.skip($n,1)

编辑:这现在是Pull Request

编辑:现在已经合并,将在 2022.08 版本中

【讨论】:

  • 谢谢@elizabeth,那肯定会成功。尽管如此,一个方法spliced 返回拼接数组同时保持原始数组不变,将是一个很好的补充。
【解决方案2】:

我不知道优雅或高效,但另一种解决方案是:

@a.grep: { $++ ≠ $n }

【讨论】:

    【解决方案3】:

    不是内置的,假设 exdices 已经按排序顺序并且不重叠,可能无法优化,没有类型检查,但至少是“加糖的”——尽管它是自然的还是人造的,无论是健康的还是腐烂的,都是口味问题:

    multi postcircumfix:<[- ]> (|args) { remove |args }
    
    sub remove( @arg is copy, +@exdices){
      for @exdices .reverse {
        when Int   { @arg .splice: $_,   1 }
        when Range { @arg .splice: .min, +$_ }
      }
      @arg
    }
    

    例如像这样使用:

    say (0,1,2,3,4,5)[- 1..2, 4]; # [0 3 5]
    

    这个“解决方案”是my answer to "Remove some characters from a string by index" 的一个数组变体,在这个答案和前面的答案中都提到了注意事项。

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 2023-01-10
      • 1970-01-01
      • 2018-06-24
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2014-12-20
      相关资源
      最近更新 更多