我的列表包含以下元素:
>>> 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
答案 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
符号'='
的结果。
或使用map
和lambda
:
>>> 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:])