我要求将一个字符串列表放入字典中,这样字符的索引就是键,值是组合字符。
我正试图尽可能简洁。
我的代码:
a = ['apple','pear']
b = map(lambda x:dict(enumerate(x)),a)
print b
输出:
[{0: 'a', 1: 'p', 2: 'p', 3: 'l', 4: 'e'}, {0: 'p', 1: 'e', 2: 'a', 3: 'r'}]
期望的输出:
{0:'ap',1:'pe',2:'pa',3:'lr',4:'e'}
答案 0 :(得分:4)
你想要拉链
dict(enumerate(zip(*a)))
或者也许是izip_longest
dict(enumerate(itertools.izip_longest(*a,fillvalue="")))
如果你真的需要,你可以很容易地加入这些信件
{k:"".join(v) for k,v in result.items()}
答案 1 :(得分:3)
你可以在词典理解中使用itertools.zip_longest
(在python 2 itertools.izip_longest
中):
>>> from itertools import zip_longest
>>>
>>> {i:''.join(j) for i,j in enumerate(zip_longest(*a,fillvalue=''))}
{0: 'ap', 1: 'pe', 2: 'pa', 3: 'lr', 4: 'e'}
答案 2 :(得分:1)
类似的解决方案
{i: x+y for i, (x,y) in enumerate(zip_longest(*a,fillvalue=''))}
{0: 'ap', 1: 'pe', 2: 'pa', 3: 'lr', 4: 'e'}
答案 3 :(得分:1)
你知道我是否可以在没有itertools导入的情况下执行此操作,是的map
将在你使用python2时捕获更短的字符串:
a = ['apple','pear']
b = {i: a + b if b else a for i, (a, b) in enumerate(map(None,*a))}
print(b)
{0: 'ap', 1: 'pe', 2: 'pa', 3: 'lr', 4: 'e'}
要为a或b工作不同的长度,我们需要更多的逻辑:
b = {i: a if not b else b if not a else a + b for i,(a, b) in enumerate(map(None, *a))}
map(None,*a)
的行为有点像zip_longest
,None将用作较短字符串的fillvalue。我们只检查a或b是否为None,并根据结果做适当的事情。