首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列表从另一个列表中移除

将列表从另一个列表中移除
EN

Stack Overflow用户
提问于 2019-12-20 10:01:03
回答 5查看 4.1K关注 0票数 12

我有两个列表,lst1lst2。我想要执行lst1 - lst2,它返回lst1的所有元素,而不是在lst2中。

代码语言:javascript
运行
复制
var lst1 = ["t1" , "t2" , "t3" , "t4"];
var lst2 = ["t2" , "t4" , "t5"];
//output: ["t1" , "t3"]
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-12-20 10:10:06

将其转换为sets并接受差异,然后将其转换回列表(请注意,元素的重复或排序都不会被保留):

代码语言:javascript
运行
复制
void main() {
  var lst1 = ["t1" , "t2" , "t3" , "t4"];
  var lst2 = ["t2" , "t4" , "t5"];
  var set1 = Set.from(lst1);
  var set2 = Set.from(lst2);
  print(List.from(set1.difference(set2)));
}

输出

代码语言:javascript
运行
复制
[t1, t3]

在网上试试

票数 10
EN

Stack Overflow用户

发布于 2019-12-20 15:10:49

使用雷·图尔建议的集合的方法可能是最快的,但是如果您的第一个列表包含要保留的副本,sets将完全销毁它们。

相反,您可以使用一个简单的列表过滤方法。

代码语言:javascript
运行
复制
void main() {
  var lst1 = ["t1" , "t2" , "t2", "t3" , "t3", "t4"];  // introduce duplicates
  var lst2 = ["t2" , "t4" , "t5"];

  var set1 = Set.from(lst1);
  var set2 = Set.from(lst2);
  print(List.from(set1.difference(set2)));
  // Output : [t1, t3]

  var filtered_lst = List.from(lst1.where(
    (value) => !lst2.contains(value)));
  print(filtered_lst);
  // Output: [t1, t3, t3]
}

如果这两个列表中都有重复项,并且您实际上希望在每个项中减去列表项,则可以使用remove方法(警告:这实际上将从第一个列表中删除项,因此可能需要首先创建一个副本)。

代码语言:javascript
运行
复制
void main() {
  var lst1 = ["t1" , "t2" , "t2", "t3" , "t3", "t4"];  // introduce duplicates
  var lst2 = ["t2" , "t4" , "t5"];

  for (var elem in lst2) {
    lst1.remove(elem);
  }
  print(lst1);
  // Output : [t1, t2, t3, t3]
  // only one occurrence of "t2" was removed.
}
票数 6
EN

Stack Overflow用户

发布于 2021-05-09 22:58:33

如果您想以非破坏性的方式执行此操作并保留顺序,则可以为此创建一个Iterable扩展。

代码语言:javascript
运行
复制
void main() {
  final lst1 = ["t1" , "t2" , "t3" , "t4"];
  final lst2 = ["t2" , "t4" , "t5"];
  final diff = lst1.whereNotIn(lst2).toList();
  print(diff);
}

extension WhereNotInExt<T> on Iterable<T> {
  Iterable<T> whereNotIn(Iterable<T> reject) {
    final rejectSet = reject.toSet();
    return where((el) => !rejectSet.contains(el));
  }
}

在这里尝试一下:safety=true

这种办法的一些好处是:

  • 不会改变原来的列表
  • 保留原来的订单
  • 也是关于Iterable的作品
  • 它使用一个集合来跟踪要拒绝的元素,因此如果这两个列表都很大,它就不会慢很多。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59423310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档