从字符串列表创建字典

时间:2016-07-27 23:59:40

标签: python regex string python-2.7 dictionary

我有一个字符串列表

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'],

但这对我很容易形成我的词典没有多大帮助。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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']})

答案 1 :(得分:2)

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

然后,我们使用列表理解 - &gt;提取字母字符。 [j for j in i if j.isalpha()],或作为生成器传递 j for j in i if j.isalpha()(在我们的案例中为生成器,将元素作为 string 连接在一起再次)。

最后检查是否存在keyvalue,以便我们可以将字典设置为此格式 - &gt; { '' : [] , ...}

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