Skip to main content
 首页 » 编程设计

python之如何以 Pythonic 方式将此元组列表转换为此字典

2025年05月04日16duanxz

我有一个元组列表

tuplist = [('person', u'English : 1, 2, 3 ; Dutch : 5, 6, 7'), ('home', u'English : 8, 9, 10; Dutch: 11, 12, 13')] 

我想把它转换成这个特定的字典

{'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']}} 

目前我是这样的:

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 

但我想将它重写为更 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} 

这是一个满嘴的东西,所以最好把语言字典拆分成一个生成器:

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} 

任何一个都会产生所需的输出:

>>> {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']}}