如何在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直接生成步长索引序列:
- 先在
pubspec.yaml添加依赖:
dependencies: collection: ^1.18.0
- 实现切片:
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
相关产品推荐
相关产品推荐

