You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dart中使用自定义步长对列表进行切片?

在Dart中实现类似Python的列表步长切片(无需手动循环)

Dart标准库确实没有像Python那样直接支持带step参数的列表切片方法(sublist和getRange仅支持起始/结束索引),但可以通过内置的Iterable工具方法或官方第三方包实现需求,无需手动编写循环或自定义扩展:

一、内置方案(无需依赖第三方包)

1. 筛选特定索引(如偶数/奇数索引)

利用asMap()将列表转为"索引-元素"的键值对集合,再通过where过滤索引,最后映射回元素:

List<Object> myList = [1, 2, 3, 4, 5, 6];

// 取偶数索引元素(0,2,4...)
var evenIndexedItems = myList.asMap().entries
    .where((entry) => entry.key % 2 == 0)
    .map((entry) => entry.value)
    .toList();
// 输出:[1, 3, 5]

// 取奇数索引元素(1,3,5...)
var oddIndexedItems = myList.asMap().entries
    .where((entry) => entry.key % 2 != 0)
    .map((entry) => entry.value)
    .toList();
// 输出:[2, 4, 6]

2. 自定义起始/结束/步长的切片

使用Iterable.generate生成符合步长规则的索引序列,再映射为对应元素:

List<Object> myList = [1, 2, 3, 4, 5, 6, 7, 8];

// 从索引1开始,到索引7结束,步长2
int start = 1;
int stop = 7;
int step = 2;

var customSlice = Iterable.generate(
  ((stop - start) / step).ceil(),
  (index) => myList[start + index * step],
).toList();
// 输出:[2, 4, 6]

二、第三方包方案(官方维护包)

使用Dart官方维护的collection包,借助Iterable.range直接生成步长索引序列:

  1. 先在pubspec.yaml添加依赖:
dependencies:
  collection: ^1.18.0
  1. 实现切片:
import 'package:collection/collection.dart';

List<Object> myList = [1, 2, 3, 4, 5, 6, 7, 8];

// 从索引0到列表末尾,步长3
var stepSlice = Iterable.range(0, myList.length, 3)
    .map((i) => myList[i])
    .toList();
// 输出:[1, 4, 7]

内容的提问来源于stack exchange,提问作者Anakhand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:55:36