首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Coding
V2EX  ›  问与答

大家有没有什么优雅的办法处理这样一段 Python 代码?

  •  
  •   dapengzhao · 44 天前 · 938 次点击
    这是一个创建于 44 天前的主题,其中的信息可能已经有所发展或是发生改变。
    a_list = []
    b_list = []
    c_list = []
    d_dict = [{'a': 1, 'b': 2, 'c': 3}, {'a': 11, 'b': 22, 'c': 33}, {'a': 111, 'b': 222, 'c': 333}]
    
    for i in d_dict:
        a_list.append(i['a'])
        b_list.append(i['b'])
        c_list.append(i['c'])
    
    res_dict = {'a': a_list, 'b': b_list, 'c': c_list}
    print(res_dict) # {'a': [1, 11, 111], 'b': [2, 22, 222], 'c': [3, 33, 333]}
    

    需要处理的 d_dict 是 django 的一个 queryset,目标是生成一个新的字典,每个 k 对应一个列表,列表里是对应 queryset 某个 k 的所有值。 实际上还有好多字段,所以这段代码在项目里面看起来很臃肿,不知道大家有没有什么优雅的方法。 注意:只用一次 for 循环,

    第 1 条附言  ·  44 天前

    感谢各位提供了很多思路,这是一个django的web项目目前采用了2楼的建议

    # 设置字典的内置对象为list
        nf_dict = defaultdict(list)
        for nf in nf_object_values:
            for k, v in dict(nf).items():
                if k == 'netflow_timestamp':
                    nf_dict[k].append(str(v))
                else:
                    nf_dict[k].append(v)
        return dict(nf_dict)
    
    15 回复  |  直到 2019-10-29 13:50:34 +08:00
        1
    jakezh   44 天前
    用二维数组吧
        2
    Orenoid   44 天前
    from collections import defaultdict
    result = defaultdict(list)
    for i in d_dict:
    result['a'].append(i['a'])
    # b, c 同理
        3
    Orenoid   44 天前
    不过你的键值很多的话不应该用 dict.items() 来做二次循环吗,为什么一定要只用一次循环
        4
    Vegetable   44 天前
    首先你这个 abc_list 完全没必要定义,直接定义一个 res_dict={a:[],b:[].c:[]},就只剩下一行定义+一个循环了,而且可以像 3 楼说的直接
    for i in d_dict:
    for attr in (a,b,c):
    res_dict[attrname].append(getattr(i,attrname))
    这样两层循环去做
        5
    Vegetable   44 天前
    *for attrname in (a,b,c):
        6
    alienx717   44 天前
    妹得,我怎么感觉只是我以前写的代码哈哈哈
        7
    dapengzhao   44 天前
    @Orenoid 谢谢解决了,我定一次 for 循环是觉得有人会想用多次字典生成式来做,但是两次 for 循环完美解决
        8
    dapengzhao   44 天前
    ```
    d_dict = [{'a': 1, 'b': 2, 'c': 3}, {'a': 11, 'b': 22, 'c': 33}, {'a': 111, 'b': 222, 'c': 333}]
    d = defaultdict(list)
    for i in d_dict:
    for k, v in i.items():
    d[k].append(v)
    print(dict(d))
    ```
        9
    ipwx   44 天前   ♥ 1
    In [1]: import pandas as pd

    In [2]: df = pd.DataFrame(data=[{'a': 1, 'b': 2, 'c': 3}, {'a': 11, 'b': 22, 'c': 33}, {'a': 111, 'b': 222, 'c': 333}], columns=['a', 'b', 'c'])

    In [3]: res_dict = {k: df[k].tolist() for k in df}

    In [4]: res_dict
    Out[4]: {'a': [1, 11, 111], 'b': [2, 22, 222], 'c': [3, 33, 333]}
        10
    ipwx   44 天前
    嘛,上面那个用 Pandas 的答案,一次 for 都不用。如果不是 web 应用而是数据处理,那么就是标准答案了。毕竟 pandas 就是用来干这种脏活的。。。
        11
    8Cangtou   44 天前
    {element_key: [n[element_key] for n in d_dict] for element_key in ["a", "b", "c"]}
        12
    8Cangtou   44 天前
    @8Cangtou
    d_dict = [{'a': 1, 'b': 2, 'c': 3}, {'a': 11, 'b': 22, 'c': 33}, {'a': 111, 'b': 222, 'c': 333}]
    print {element_key: [n[element_key] for n in d_dict] for element_key in ["a", "b", "c"]}
        13
    xujunfu   44 天前
    In [13]: import pandas as pd

    In [14]: d_dict = [{'a': 1, 'b': 2, 'c': 3}, {'a': 11, 'b': 22, 'c': 33}, {'a': 111, 'b': 222, 'c': 333}]

    In [15]: res_dict = pd.DataFrame(d_dict).to_dict()
        14
    Kilerd   44 天前
    @ipwx #9 res_dict = {k: df[k].tolist() for k in df} 这个不是循环吗????
        15
    princelai   44 天前
    ```
    import pandas as pd

    pd.DataFrame(d_dict).to_dict('list')
    ```


    前提是你的 d_dict 里每一个 dict 是一样长
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   975 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 21:11 · PVG 05:11 · LAX 13:11 · JFK 16:11
    ♥ Do have faith in what you're doing.