首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中扩展此嵌套列表理解

如何在Python中扩展此嵌套列表理解
EN

Stack Overflow用户
提问于 2018-10-16 07:16:40
回答 2查看 771关注 0票数 2

考虑下面的函数:

它接受列表的列表作为输入,并从每个列表中查找元素的所有组合。

代码语言:javascript
复制
def product(llist):
    result = [[]]

    for lst in llist:
        result = [x + [y] for x in result for y in lst]

    return result

例如:

代码语言:javascript
复制
product([[1,2], [3], [4,5]])

将返回:

代码语言:javascript
复制
[[1, 3, 4], [1, 3, 5], [2, 3, 4], [2, 3, 5]]

我试图理解这个函数是如何工作的,并因此尝试扩展列表的理解。

下面是一个尝试:

代码语言:javascript
复制
def product2(llist):
    result = [[]]
    for lst in llist:
        for x in result:
            result = []
            for y in lst:
                result.append(x+[y])

    return result

这并没有给出正确的结果,它返回:

代码语言:javascript
复制
[[2, 3, 4], [2, 3, 5]]

根据product2的定义,我理解这个不正确的结果。但是我无法扩展原始的product函数来理解它是如何工作的。

有人能详细解释一下product函数中的嵌套列表理解吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-16 07:30:09

列表理解是为lst中的每个元素创建一个新列表,并通过将这个小的单个元素列表与result中已有的所有列表相结合来创建更多的新列表。

因此,例如,如果是result = [ [1, 2], [3, 4] ]lst = [10, 11],则新结果将为[[1, 2, 10], [1, 2, 11], [3, 4, 10], [3, 4, 11]]

它对llist中的每个lst执行此操作

代码语言:javascript
复制
def product2(llist):
    result = [[]]
    for lst in llist:
        new_result = [] # let's manually build out new result
        for existing in result:            
            for element in lst:
                new_result.append(existing + [element])
        result = new_result # update result for next lst
    return result
票数 3
EN

Stack Overflow用户

发布于 2018-10-16 07:37:01

如果打印result的部分值会很有帮助,如下所示:

代码语言:javascript
复制
def product(llist):
    result = [[]]

    for lst in llist:
        result = [x + [y] for x in result for y in lst]
        print(result)

    return result

首先,结果的内部list是空的,因此它将为传递的第一个内部列表中的每个元素创建一个新的内部列表:

代码语言:javascript
复制
[[1], [2]]

然后在第二次传递中,结果中的每个内部列表将被替换为自身加上第二个内部列表中的每个元素作为参数传递:

代码语言:javascript
复制
[[1, 3], [2, 3]]

然后,当您有一个包含多个元素的内部参数列表时,它将在结果中复制当前现有的内部列表

代码语言:javascript
复制
[[1, 3, 4], [1, 3, 5], [2, 3, 4], [2, 3, 5]]

它是这样发生的,因为在一次遍历列表理解的过程中,有问题的列表将不会被更新。它将只在理解结束时更新。

你可以看到的另一种方式类似于网格:

代码语言:javascript
复制
------------------
|    |  1  |  2  |
------------------
| [] | [1] | [2] |
------------------

result = [[1],[2]]

---------------
|     |   3   |
---------------
| [1] | [1,3] |
---------------
| [2] | [2,3] |
---------------

result = [[1,3],[2,3]]

-----------------------------
|       |    4    |    5    |
-----------------------------
| [1,3] | [1,3,4] | [1,3,5] |
-----------------------------
| [2,3] | [2,3,4] | [2,3,5] |
-----------------------------

result = [[1,3,4],[2,3,4],[1,3,5],[2,3,5]]

考虑到这一点,没有理解的版本将需要一个临时变量来保存更新的值:

代码语言:javascript
复制
def product2(llist):
    result = [[]]
    for lst in llist:
        temp_res = []
        for x in result:
            for y in lst:
                temp_res.append(x+[y])
        result = temp_res

    return result
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52825941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档