我有一个元组列表
tuplist = [('person', u'English : 1, 2, 3 ; Dutch : 5, 6, 7'), ('home', u'English : 8, 9, 10; Dutch: 11, 12, 13')]
Run Code Online (Sandbox Code Playgroud)
我想将此转换为这个特定的词典
{'person': {u'Dutch': [u'5', u'6', u'7'], u'English': [u'1', u'2', u'3']}, 'home': {u'Dutch': [u'11', u'12', u'13'], u'English': [u'8', u'9', u'10']}}
Run Code Online (Sandbox Code Playgroud)
目前我这个:
dic = dict(tuplist)
final_dic = {}
for x in dic:
str = dic[x]
list1 = [y.strip() for y in str.split(';')]
subdict = {}
for z in list1:
list2 = [y.strip() for y in z.split(':')]
subdict[list2[0]] = [y.strip() for y in list2[1].split(',')]
final_dic[x] = subdict
Run Code Online (Sandbox Code Playgroud)
但我想把它重写为Pythonic.有人有想法吗?
您可以嵌套一组字典和列表推导:
{k: {l.strip(): [n.strip() for n in nums.split(',')]
for i in v.split(';')
for l, nums in (i.split(':', 1),)}
for k, v in tuplist}
Run Code Online (Sandbox Code Playgroud)
这是一个很大的口,所以最好将语言字典拆分成一个生成器:
def language_values(line):
for entry in line.split(';'):
lang, nums = entry.split(':', 1)
yield lang.strip(), [n.strip() for n in nums.split(',')]
{k: dict(language_values(v)) for k, v in tuplist}
Run Code Online (Sandbox Code Playgroud)
任何一个产生所需的输出:
>>> {k: {l.strip(): [n.strip() for n in nums.split(',')]
... for i in v.split(';')
... for l, nums in (i.split(':', 1),)}
... for k, v in tuplist}
{'person': {u'Dutch': [u'5', u'6', u'7'], u'English': [u'1', u'2', u'3']}, 'home': {u'Dutch': [u'11', u'12', u'13'], u'English': [u'8', u'9', u'10']}}
>>> def language_values(line):
... for entry in line.split(';'):
... lang, nums = entry.split(':', 1)
... yield lang.strip(), [n.strip() for n in nums.split(',')]
...
>>> {k: dict(language_values(v)) for k, v in tuplist}
{'person': {u'Dutch': [u'5', u'6', u'7'], u'English': [u'1', u'2', u'3']}, 'home': {u'Dutch': [u'11', u'12', u'13'], u'English': [u'8', u'9', u'10']}}
Run Code Online (Sandbox Code Playgroud)