V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
css3
V2EX  ›  Python

昨天没说清楚,今天再来请教一下!

  •  
  •   css3 · 2020-11-14 14:50:29 +08:00 · 2318 次点击
    这是一个创建于 1459 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样的,有多个长度一样且是偶数的 list,现在假设 2 个 A, B

    A = [1, 2, 3, 4]
    B = ["a", "b", "c", "d"]
    

    想生成一个这样类型的list

    # f1 和 f2 是固定不变的, value 取自于 A, B,每一项分别对应到 f1,f2 上, 然后两两结合, 1a, 2b 一组,3c, 4d 一组,依次类推...
    ret = [
        [{"f1":1, "t1":"a"},{"f2":2, "t2":"b"}],
        [{"f1":3, "t1": "c"}, {"f2":4, "t2": "d"}]
    ]
    
    # 我写了个列表推导式,但结果不符合预期
    myret = [
        [{"f1":A[x], "t1":B[x]}, {"f2":A[x+1], "t2":B[x+1]}] for x in range(len(A)-1)
    ]
    
    # 它输出是这样,中间重复了,想不到再怎么处理一下了
    [[{'f1': 1, 't1': 'a'}, {'f2': 2, 't2': 'b'}], [{'f1': 2, 't1': 'b'}, {'f2': 3, 't2': 'c'}], [{'f1': 3, 't1': 'c'}, {'f2': 4, 't2': 'd'}]]
    
    
    12 条回复    2020-11-15 12:05:44 +08:00
    yaodong
        1
    yaodong  
       2020-11-14 14:56:35 +08:00
    ```
    myret = [{"f1": x, "t1": y} for x, y in zip(a, b)]
    ```
    darklowly
        2
    darklowly  
       2020-11-14 14:59:21 +08:00
    python 忘记了,你这个是逻辑错误,我按照你的语法修改了一下

    A = [1, 2, 3, 4]
    B = ["a", "b", "c", "d"]

    myret = [
    [{"f1":A[x], "t1":B[x]}] for x in range(len(A))
    ]

    print(myret)
    css3
        3
    css3  
    OP
       2020-11-14 15:02:06 +08:00
    @yaodong 老哥,不是这样😂
    css3
        4
    css3  
    OP
       2020-11-14 15:03:16 +08:00
    @darklowly 😂第一版就是你这样,为了实现需求,才改主帖这样了
    darklowly
        5
    darklowly  
       2020-11-14 15:26:28 +08:00
    哦那就是这样??

    A = [1, 2, 3, 4]
    B = ["a", "b", "c", "d"]


    length = int(len(A)/2)

    myret = [
    [{"f1":A[2*x], "t1":B[2*x]}, {"f2":A[2*x+1], "t2":B[2*x+1]}] for x in range(length)
    ]

    print(myret)
    JeffGe
        6
    JeffGe  
       2020-11-14 15:30:32 +08:00 via Android
    ……[2 * x]……[2 * x]……[2 * x + 1]……[2 * x + 1]……for x in range(len(A)//2)……



    ……[x]……[x]……[x + 1]……[x + 1]……for x in range(0, len(A), 2)……
    MrGba2z
        7
    MrGba2z  
       2020-11-14 15:37:02 +08:00
    ps = list(zip(A, B))

    myret = [[{"f1": p[0], "t1": p[1]}, {"f1": ps[i+1][0], "t2":ps[i+1][1]}] for i, p in enumerate(ps[:-1])]
    MrGba2z
        8
    MrGba2z  
       2020-11-14 15:40:14 +08:00
    额..刚才把你手头的和想要的看反了..


    ps = list(zip(A, B))
    myret = [[{"f1": p[0], "t1": p[1]}, {"f1": ps[2*i+1][0], "t2":ps[2*i+1][1]}] for i, p in enumerate(ps[:-1:2])]
    css3
        9
    css3  
    OP
       2020-11-14 16:23:05 +08:00
    @darklowly
    @JeffGe
    @MrGba2z
    老哥们,成了,感谢感谢,学习了,还是采用的 range, 关键点是 range 的步偿取 2😍
    freakxx
        10
    freakxx  
       2020-11-15 00:55:42 +08:00
    我一般不会这么去写代码,感觉太硬,

    我会先实现一个 chunk 方法,把长度划分成想要的长度,
    然后再拼装在一起
    最后再按想要的结构去做处理。

    代码:
    https://gist.github.com/chrisguox/030515515f64e38efced2066dee7991b
    freakxx
        11
    freakxx  
       2020-11-15 01:00:11 +08:00
    > 是这样的,有多个长度一样且是偶数的 list,现在假设 2 个 A, B

    我感觉像这样的需求,想法,
    一般是要拆分会比较好,

    像我上面写的代码,
    如果需要的话,再写
    一个 generate_chunk_for_fields(),return *args,
    写一组 key 名,

    那么以后再加什么,只是需要把东西扔进去这个定义函数, *args 也直接转进去 generate_ft_struct, 直接做匹配就 ok 。
    css3
        12
    css3  
    OP
       2020-11-15 12:05:44 +08:00 via iPhone
    @freakxx 感谢老哥的思路,受益匪浅👏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5725 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:02 · PVG 11:02 · LAX 19:02 · JFK 22:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.