将 str.split() 的结果作为列表理解的一部分存储到字典中的最佳方法是什么?



给定以下示例数据:

values=['A 1','B 2','C 3']

我想创建一个字典,其中 A 映射到 1,B 映射到 2,C 映射到 3。以下作品,但有重复:

my_dict={value.split()[0]:value.split()[1] for value in values}

重复value.split()看起来很难看。有没有办法更优雅地创建字典而不重复value.split()

我能想到的两种方法:

>>> {k:v for k,v in (s.split() for s in values)}
{'A': '1', 'B': '2', 'C': '3'}
>>> dict(s.split() for s in values)
{'A': '1', 'B': '2', 'C': '3'}

我建议阅读有关dict类型:https://docs.python.org/3/library/stdtypes.html#mapping-types-dict;特别是:

可迭代对象中的每个项本身必须是恰好具有两个对象的可迭代对象。每个项目的第一个对象成为新字典中的键,第二个对象成为相应的值。

以及在 PEP 274 中引入字典理解:

字典推导的语义实际上可以在股票 Python 2.2 中演示,通过将列表推导传递给内置字典构造函数:

>>> dict([(i, chr(65+i)) for i in range(4)])

在语义上等效于:

>>> {i : chr(65+i) for i in range(4)}

对于功能解决方案,您可以将dictmap一起使用,并str.split

values = ['A 1', 'B 2', 'C 3']
res = dict(map(str.split, values))
{'A': '1', 'B': '2', 'C': '3'}

你可以这样做pythonic:

>>> values =['A 1','B 2','C 3']
>>> dict(map(str.split, values))
{'A': '1', 'C': '3', 'B': '2'}

str.split([sep[, maxsplit]](

返回字符串中单词的列表,使用 sep 作为分隔符字符串。如果给出了最大拆分,则最多完成最大拆分拆分(因此,列表最多将包含最大拆分+1个元素(。如果未指定 maxsplit 或 -1,则拆分次数没有限制(进行所有可能的拆分(。 如果给出 sep,则连续分隔符不会组合在一起,并被视为分隔空字符串(例如,'1,,2'.split(','( 返回 ['1', '', '2'](。sep 参数可以包含多个字符(例如,'1<>2<>3'.split('<>'( 返回 ['1', '2', '3'](。使用指定的分隔符拆分空字符串将返回 ['']。

map(函数,可迭代,...(

将函数应用于可迭代对象的每个项目并返回结果列表。如果传递了其他可迭代参数,则函数必须接受这么多参数,并并行应用于所有可迭代对象中的项。如果一个可迭代对象比另一个可迭代对象短,则假定它使用 None 项进行扩展。如果函数为 None,则假定恒等函数;如果有多个参数,map(( 返回一个由元组组成的列表,其中包含所有可迭代对象中的相应项(一种转置操作(。可迭代参数可以是序列或任何可迭代对象;结果始终是一个列表。

您可以看到字典不是按顺序排列的。使用 collections.orderedDict,我们可以保留给定输入的顺序。

>>> import collections
>>> values =['A 1','B 2','C 3']
>>> my_ordered_dict = collections.OrderedDict(map(str.split, values))
>>> my_ordered_dict
OrderedDict([('A', '1'), ('B', '2'), ('C', '3')])

最新更新