如何在Python中将包含键值的字符串列表映射到dict?

时间:2018-01-08 09:29:03

标签: python functional-programming

我的列表包含以下元素:

>>> s = "foo a=b c=d e=f"
>>> s.split()
['set', 'a=b', 'c=d', 'e=f']
>>> splitted = s.split()
>>> splitted[1:]
['a=b', 'c=d', 'e=f']

现在我想使用map来获得以下结果:

[{'a': 'b'}, {'c': 'd'}, {'e': 'f'}]

我尝试了以下内容,但这给了我一个IndexError:

>>> map(lambda x : dict((a[0], a[1]) for a in x.split('=')) , splitted[1:])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
  File "<stdin>", line 1, in <genexpr>
IndexError: string index out of range

3 个答案:

答案 0 :(得分:5)

你不想迭代你已经拆分的东西,只需将它包装在迭代中,就像元组一样:

>>> splitted
['a=b', 'c=d', 'e=f']
>>> [dict((x.split('='),)) for x in splitted]
[{'a': 'b'}, {'c': 'd'}, {'e': 'f'}]

(x.split('='),)

是一个包含一个元素的元组,.split符号'='的结果。

或使用maplambda

>>> list(map(lambda x: dict((x.split('='),)), splitted))
[{'a': 'b'}, {'c': 'd'}, {'e': 'f'}]

我会说,这似乎是一个相当无用的数据结构。

要清楚,你的构造失败了,因为你的迭代太深了。生成器表达式:

(a[0], a[1]) for a in x.split('=')

迭代x.split('='),在这种情况下,它总是一个包含两个元素的列表,长度为1的字符串,例如['a','b']

答案 1 :(得分:1)

您可以创建一个简单的列表理解来实现此目的。在这里,您需要根据=拆分每个字符串,并将其输入到dict。例如:

>>> my_list = ['a=b', 'c=d', 'e=f']

>>> [dict([my_str.split('=')])  for my_str in my_list]
[{'a': 'b'}, {'c': 'd'}, {'e': 'f'}]

这是使用 lambda 的解决方案的工作版本:

#     actually you don't need to iterate here v
>>> list(map(lambda x : dict([[a for a in x.split('=')]]) , my_list))
[{'a': 'b'}, {'c': 'd'}, {'e': 'f'}]

这可以简化为:

>>> list(map(lambda x : dict([x.split('=')]) , my_list))
[{'a': 'b'}, {'c': 'd'}, {'e': 'f'}]

答案 2 :(得分:0)

您可以使用zip功能:

result= list(map(lambda x: dict(zip(*x.split('='))) ,splitted[1:]))

OR

needed = list(dict(zip(*x.split('='))) for x in splitted[1:])