我有两个列表,lst1和lst2。我想要执行lst1 - lst2,它返回lst1的所有元素,而不是在lst2中。
var lst1 = ["t1" , "t2" , "t3" , "t4"];
var lst2 = ["t2" , "t4" , "t5"];
//output: ["t1" , "t3"]发布于 2019-12-20 10:10:06
将其转换为sets并接受差异,然后将其转换回列表(请注意,元素的重复或排序都不会被保留):
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)));
}输出
[t1, t3]发布于 2019-12-20 15:10:49
使用雷·图尔建议的集合的方法可能是最快的,但是如果您的第一个列表包含要保留的副本,sets将完全销毁它们。
相反,您可以使用一个简单的列表过滤方法。
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方法(警告:这实际上将从第一个列表中删除项,因此可能需要首先创建一个副本)。
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.
}发布于 2021-05-09 22:58:33
如果您想以非破坏性的方式执行此操作并保留顺序,则可以为此创建一个Iterable扩展。
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
这种办法的一些好处是:
https://stackoverflow.com/questions/59423310
复制相似问题