2016-07-27 132 views
0

我有一个字符串从字符串列表创建字典

list = ['2(a)', '2(b)', '3', '3(a)', '1d', '5'] 

它是故意的1D,3和5不涉及括号的列表。

我想创建一个字典,看起来像这样:

dict = {'2': 'a', '2': 'b', '3': 'a', '1': 'd'} 

dict = {'2': ['a', 'b'], '3': ['a'], '1': ['d']}. 

本质,忽略这些字符串没有字母A-Z。我已经使用正则表达式从顶部列表中提取以下内容:

['a', 'b', 'a', 'd'], 

但是,这并没有帮助我很容易地形成我的字典。

任何帮助,非常感谢。

+4

在哪里应该从哪里来的?此外,字典无法将“2”映射到“a”和“b”,因此您必须使用第二个结构来显示字典。 – user2357112

+1

你可以展示你到目前为止所尝试过的吗? –

回答

2

这是使用setdefault()字典定义的好时机你的字典的结构。第一部分涉及使用捕获所有数字的正则表达式从元素中捕获数字。然后使用join()list连接起来。

然后,我们使用一个列表理解只提取字母字符 - >[j for j in i if j.isalpha()],或通过在我们的情况下,发电机j for j in i if j.isalpha()发电机,加入元素为string一起再次 )。

最后一个检查,看看这两个keyvalue存在,因此,我们可以设置我们的字典是这种格式 - >{ '' : [] , ...}

import re 

def to_dict(l): 
    d = {} 
    for i in l: 
     key = re.findall(r'\d+', i) 
     value = ''.join(j for j in i if j.isalpha()) 
     if key and value: 
      d.setdefault(''.join(key), []).append(value)  
    return d 

输出示例:

l = ['2(a)', '2(b)', '3', '3(a)', '1c', '5'] 
print to_dict(l) 
>>> {'1': ['c'], '3': ['a'], '2': ['a', 'b']} 
+0

那里没有列表理解,只有一个生成器表达式。 – TigerhawkT3

+0

@ TigerhawkT3更新了更多的信息,伟大的答案btw! – ospahiu

4

因为字典不能包含重复键,使用defaultdict

import collections 
l = ['2(a)', '2(b)', '3', '3(a)', '1c', '5'] 
d = collections.defaultdict(list) 
for item in l: 
    num = ''.join(c for c in item if c.isdigit()) 
    word = ''.join(c for c in item if c.isalpha()) 
    if word and num: 
     d[num].append(word) 

结果:

>>> print(d) 
defaultdict(<class 'list'>, {'2': ['a', 'b'], '1': ['c'], '3': ['a']})