64

我正在寻找一种在 Dart 中将 List 转换为 Map的现成方法。

例如,在 python 中,您可以执行以下操作:

l= [ ('a',(1,2)), ('b',(2,3)), ('c',(3,4) ) ]
d=dict(l)
==> {'a': (1, 2), 'c': (3, 4), 'b': (2, 3)}

dict 函数需要一对列表。对于每一对,第一个元素用作键,第二个元素用作数据。

在 Dart 中,我看到了 List 的以下方法:asMap(),但它没有达到我的预期:它使用列表索引作为键。我的问题:

  • 你知道 Dart 库中有什么可以做到这一点吗?
  • 如果没有,有没有计划在核心库中添加这样的功能?

提议:

List.toMap() //same as python dict.
List.toMap( (value) => [ value[0], value[1] ] ) //Using anonymous function to return a key and a value from a list item.

谢谢并恭祝安康,

尼古拉斯

4

8 回答 8

89

您可以使用Map.fromIterable

var result = Map.fromIterable(l, key: (v) => v[0], value: (v) => v[1]);

collection-for(从 Dart 2.3 开始):

var result = { for (var v in l) v[0]: v[1] };
于 2013-05-30T08:55:46.667 回答
65

在 Dart 1.1 中,你可以使用Map 的这个构造函数:

new Map.fromIterable(list, key: (v) => v[0], value: (v) => v[1]);

这将最接近您的原始提案。

于 2014-01-23T11:10:22.597 回答
22

对于 Dart 2.3 及更高版本,

有很多解决方案,但最简单的是:

1-使用asMap()功能

List list = ['steve', 'bill', 'musk'];
Map map = list.asMap();
print(map);

输出 :

{0: steve, 1: bill, 2: musk}

2-for-in在地图中使用集合 Map map = {};

List list = ['steve', 'bill', 'musk'];
Map map = {for (var item in list) '$item' : 'valueOf$item'};
print(map);

输出 :

{steve: valueOfsteve, bill: valueOfbill, musk: valueOfmusk}

希望它会有所帮助。

于 2021-02-09T01:59:49.690 回答
10

另一种可能性是使用Map.fromEntries()构造函数:

final result = Map.fromEntries(l.map((value) => MapEntry(value[0], value[1])));
于 2020-07-07T18:56:13.500 回答
2

这可能与答案没有直接关系,但是,如果有人想要转换。

var list = ['fee','fi','fo','fum'];

到像这样的地图,

var map = {0:'fee', 1:'fi', 2:'fo', 3:'fum'};

您可以使用

var map = list.asMap();

附言

此地图不可编辑

于 2021-01-19T07:46:17.677 回答
2

细节

  • 颤振 1.26.0-18.0.pre.106

解决方案

/libs/extensions/list.dart

extension MapFromList<Element> on List<Element> {
  Map<Key, Element> toMap<Key>(
          MapEntry<Key, Element> Function(Element e) getEntry) =>
      Map.fromEntries(map(getEntry));

  Map<Key, Element> toMapWhereKey<Key>(Key Function(Element e) getKey) =>
      Map.fromEntries(map((e) => MapEntry(getKey(e), e)));
}

用法

import 'package:myApp/libs/extensions/list.dart';

final list = [1,2,3,4];
print(list.toMap((e) => MapEntry(e-1, e)));  // {0: 1, 1: 2, 2: 3, 3: 4}
print(list.toMapWhereKey((e) => "str $e"));  // {str 1: 1, str 2: 2, str 3: 3, str 4: 4}
于 2021-02-02T01:36:52.603 回答
0

dart 中还没有元组或对的概念(除了两个元素的 Iterable)。如果 Dart 有这样的概念,那么issue 7088建议使用 Map.fromPairs 构造函数来解决这个问题。

于 2013-05-30T17:33:34.460 回答
0

这就是如何将列表转换为地图

void main() {
  var list = [99, 25, 45, 11, 5, 125, 50];
  SplayTreeMap numbers = new SplayTreeMap<int, int>();
  numbers.addAll(list.asMap());
  print(numbers);
}
于 2022-01-04T06:19:51.423 回答