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
youthfire
V2EX  ›  Python

Python 定义函数中两列不同长度的列表为参数失败

  •  
  •   youthfire · 2019-03-05 14:28:54 +08:00 · 1705 次点击
    这是一个创建于 2092 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已经定义了过程 dashboard,参数为两个不同长度的列表

    namepool = [clienta,clientb,clientc]

    typepool = [type1,type2,type3,type4]

    目前想让函数 dashboard 循环处理,即 dashboard[clienta,type1],dashboard[clienta,type2]...

    目前写一个 dashboard(x for x in namepool, y for y in typepool)

    这个语法错误,应该如何正确表达呢?

    10 条回复    2019-03-09 09:18:06 +08:00
    gnozix
        1
    gnozix  
       2019-03-05 15:41:24 +08:00
    [x, y for x in namepool for y in typepool]
    qdzzyb
        2
    qdzzyb  
       2019-03-05 15:53:23 +08:00
    dashboard 接受的参数到底什么 是列表的话直接传进去不就可以了
    jmc891205
        3
    jmc891205  
       2019-03-05 15:54:19 +08:00 via iPhone   ❤️ 1
    你要写两层 for 循环 然后在最内层调用 dashboard 才对
    jingxyy
        4
    jingxyy  
       2019-03-05 16:11:01 +08:00
    还是再整理一下问题描述吧
    前面说 dashboard 的参数是*两个不同长度的列表* 那不就直接把两个 pool 传进去不就行了吗?毕竟那两个 pool 不就是*两个不同长度的列表*吗?
    后面的 dashboard[clienta,type1]这都不知道是啥了,也许是想说 dashboard(clienta,type)?如果是的话那不就和“ dashboard 的参数是两个不同长度的列表”矛盾了吗?
    youthfire
        5
    youthfire  
    OP
       2019-03-05 16:36:02 +08:00
    谢谢楼上各位,表述得不够清楚,望见谅。我要表达的效果是其实就是 3 楼说的两层 for 嵌套的结果,但是我想用一句话写完。类似于两个列表分别是[1,2,3] [4,5,6,7],我希望是 dashboard(1,4),dashboard(1,5),dashboard(1,6),dashboard(1,7),dashboard(2,4),dashboard(2,5),dashboard(2,6),dashboard(2,7), dashboard(3,4),dashboard(3,5),dashboard(3,6),dashboard(3,7)

    dashboard(namepool, typepool)会直接报 TypeError: unhashable type: 'list'

    dashboard(x for x in namepool, y for y in typepool) 会直接报 SyntaxError: Generator expression must be parenthesized
    hotea
        6
    hotea  
       2019-03-05 16:36:06 +08:00   ❤️ 1
    from itertools import combinations, permutations
    xpresslink
        7
    xpresslink  
       2019-03-05 16:58:38 +08:00
    关键是数据对齐的策略是什么?
    >>> namepool = 'clienta,clientb,clientc'.split(',')
    >>> typepool = 'type1,type2,type3,type4'.split(',')
    >>> from itertools import zip_longest
    >>> [(c,t) for c,t in zip_longest(namepool,typepool,fillvalue=None)]
    [('clienta', 'type1'), ('clientb', 'type2'), ('clientc', 'type3'), (None, 'type4')]
    >>>
    jingxyy
        8
    jingxyy  
       2019-03-05 17:01:06 +08:00   ❤️ 1
    那就这么搞就行啦:
    [darshboard(x, y) for x in namepool for y in typepool]
    如果你要组合的参数列表更多,或者甚至是不确定的数量,那就可以去研究研究 6 楼说的那俩函数。
    xpresslink
        9
    xpresslink  
       2019-03-05 17:02:18 +08:00   ❤️ 1
    >>> from itertools import product
    >>> list(product([1,2,3], [4,5,6,7]))
    [(1, 4), (1, 5), (1, 6), (1, 7), (2, 4), (2, 5), (2, 6), (2, 7), (3, 4), (3, 5), (3, 6), (3, 7)]
    >>>
    aieike
        10
    aieike  
       2019-03-09 09:18:06 +08:00 via Android   ❤️ 1
    列表推导式中循环后不要逗号
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2921 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:00 · PVG 23:00 · LAX 07:00 · JFK 10:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.