【问题标题】:Creating a dictionary from a list of strings从字符串列表创建字典
【发布时间】:2016-12-02 04:16:39
【问题描述】:

我有一个字符串列表

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

但这并没有帮助我轻松地编写我的字典。

非常感谢任何帮助。

【问题讨论】:

  • 'd' 应该来自哪里?此外,一个字典不能将'2' 映射到'a''b',所以你必须为你的字典使用第二个结构。
  • 你能展示一下你迄今为止尝试过的东西吗?

标签: python regex string python-2.7 dictionary


【解决方案1】:

由于字典不能包含重复键,请使用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']})

【讨论】:

    【解决方案2】:

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

    然后我们使用 list comprehension -> [j for j in i if j.isalpha()] 或作为 generator j for j in i if j.isalpha() 仅提取 alphabet 字符( 在我们的例子中是生成器,将元素作为一个 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']}
    

    【讨论】:

    • 那里没有列表理解,只有一个生成器表达式。
    • @TigerhawkT3 更新了更多信息,顺便说一句,答案很好!
    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 2014-02-10
    • 2016-03-23
    • 2021-01-29
    • 2016-01-13
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多