【问题标题】:Parsing list items and returning a dictionary using comprehension解析列表项并使用理解返回字典
【发布时间】:2018-08-01 07:37:04
【问题描述】:

我有一个需要处理的两个项目列表。这些项目是从数据库中检索的,因此它们实际上是 header: value 对,但它们是未解析的。它们是由制表符分隔的字符串,因此列表如下所示:

my_list = ['header1\theader2\theader3\theader4', 'val1\tval2\tval3\tval4']

我需要从键值对创建字典。目前我用列表理解来做:

keys = [k.strip() for k in my_list[0].split('\t')]
vals = [v.strip() for v in my_list[1].split('\t')]
return dict(zip(keys, vals))

我认为可能有一种方法可以使用 dict comprehension 来代替,但我不知道怎么做。是否可以解析列表项并使用单行或更 Python 的方式返回字典?

【问题讨论】:

    标签: python python-2.7 dictionary dictionary-comprehension


    【解决方案1】:

    我发现下面最优雅的解决方案:

    dict_comp = dict(zip(*map(lambda x: x.split('\t'), my_list)))
    print(dict_comp)  # -> {'header1': 'val1', 'header2': 'val2', 'header3': 'val3', 'header4': 'val4'}
    

    或者,lambda 可以替换为 生成器表达式

    dict_comp = dict(zip(*(x.split('\t') for x in my_list)))
    

    如果字符串不包含任何空格,则可以进一步缩短为:

    dict_comp = dict(zip(*map(str.split, my_list)))  # kudos @Chris_Rands
    

    【讨论】:

    • 最优雅的就是不使用 lambda:dict_comp = {k.strip():v.strip() for k,v in zip(*(l.split('\t') for l in my_list))}
    • @Jean-FrançoisFabre 为什么.strip() 打电话?
    • @PaxVobiscum 我不会这么说.. “是否可以解析列表项并使用单行或更 Pythonic 的方式返回字典?”。他只是说他认为他可以通过 dict-comprehension 做得更好。
    • @Ev.Kounis 唯一的兴趣使用 dictcomp 是如果你被 python 2.6 卡住了
    • dict(zip(*map(str.split, my_list))) ?
    【解决方案2】:

    试试这样的

    dict_comp = {k.strip():v.strip() for k,v in 
                   zip(my_list[0].split('\t'), my_list[1].split('\t'))}
    

    【讨论】:

    • 不是我的反对意见,但表达式看起来有点麻烦。我会做dict_comp = {k:v for k,v in zip(*(l.split('\t') for l in my_list))} 以避免重复,而且你不需要剥离。
    • 为什么是strip()? .
    • @Chris_Rands 只是试图更广泛地解决 Vinny 的问题。当我们不看的时候,我无法想象他在用他的代码做什么:-)
    • @ChristianDean 当然,但这不是我们要解决的问题。如果 OP 打算使用strip,无论如何。我必须相信有一个理由把它放在那里。
    • 啊,我明白了!我的坏@Pax。我没有意识到 OP 在他的原始代码中已经有了str.strip。在那种情况下,是的,我同意。人们应该努力尽可能忠实于 OP 的代码。
    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多