首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类似于Zip的函数,它遍历列表中的多个项并返回可能性。

类似于Zip的函数,它遍历列表中的多个项并返回可能性。
EN

Stack Overflow用户
提问于 2022-07-12 17:11:54
回答 4查看 236关注 0票数 7

在以下代码中:

代码语言:javascript
运行
复制
a = [["2022"], ["2023"]]
b = [["blue", "red"], ["green", "yellow"]]
c = [["1", "2", "3"], ["4", "5", "6", "7"], ["8", "9", "10", "11"], ["12", "13"]]

我想要一个输出这一点的函数,但是对于任意数量的变量:

代码语言:javascript
运行
复制
[
    ["2022", "blue", "1"],
    ["2022", "blue", "2"],
    ["2022", "blue", "3"],
    ["2022", "red", "4"],
    ["2022", "red", "5"],
    ["2022", "red", "6"],
    ["2022", "red", "7"],
    ["2023", "green", "8"],
    ["2023", "green", "9"],
    ["2023", "green", "10"],
    ["2023", "green", "11"],
    ["2023", "yellow", "12"],
    ["2023", "yellow", "13"],
]

我已经搜索了一个函数来使用itertools或zip来完成这个任务,但是还没有找到任何东西。

为了澄清这一点,我的用例是迭代嵌套/多级下拉菜单的值(第一个下拉菜单返回选项,每个选项返回不同的下拉菜单,等等)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-07-12 17:31:20

首先,将第一个参数加入到一个列表中,每个列表中只有一个元素。

然后,对于下一个参数中的每个sublist及其索引i,您将选择前一个迭代res[i]的第一个列表,并将其添加到aux len(子列表)列表中,每个列表都是带有来自sublist的一个项的res[i]

代码语言:javascript
运行
复制
from itertools import chain

def f(*args):
    res = list(chain.from_iterable([[item] for item in l] for l in args[0]))
    for arg in args[1:]:
        aux = []
        for i, sublist in enumerate(arg):
            aux += [res[i] + [opt] for opt in sublist]
        res = aux
    return res

此外,如果要验证传递给函数的参数是否正确,可以使用以下方法:

代码语言:javascript
运行
复制
def check(*args):
    size = sum(len(l) for l in args[0])
    for arg in args[1:]:
        if len(arg) != size:
            return False
        size = sum(len(l) for l in arg)
    return True
票数 13
EN

Stack Overflow用户

发布于 2022-07-12 18:03:56

代码语言:javascript
运行
复制
def foo(*args):
    arrs = list(args)
    prev = arrs[0]
    
    def bar(arr1, arr2):
        ans = []
        for x, y in zip(arr1, arr2):
            for el in y: 
                ans.append(x + [el])
        return ans
    
    for curr in arrs[1:]:
        ans = bar(prev, curr)
        prev = ans
    
    return ans

foo(a, b, c)
# [['2022', 'blue', '1'],
#  ['2022', 'blue', '2'],
#  ['2022', 'blue', '3'],
#  ['2022', 'red', '4'],
#  ['2022', 'red', '5'],
#  ['2022', 'red', '6'],
#  ['2022', 'red', '7'],
#  ['2023', 'green', '8'],
#  ['2023', 'green', '9'],
#  ['2023', 'green', '10'],
#  ['2023', 'green', '11'],
#  ['2023', 'yellow', '12'],
#  ['2023', 'yellow', '13']]
票数 5
EN

Stack Overflow用户

发布于 2022-07-13 16:31:33

就像D.B的答案,但是使用reduce和列表理解:

代码语言:javascript
运行
复制
from functools import reduce
from pprint import pprint

a = [["2022"], ["2023"]]
b = [["blue", "red"], ["green", "yellow"]]
c = [["1", "2", "3"], ["4", "5", "6", "7"], ["8", "9", "10", "11"], ["12", "13"]]

def foo(*args):
    def bar(arr1, arr2):
        return [
            x + [el]
            for x, y in zip(arr1, arr2)
            for el in y
        ]
    return reduce(bar, args)

pprint(foo(a, b, c))

输出(在网上试试!):

代码语言:javascript
运行
复制
[['2022', 'blue', '1'],
 ['2022', 'blue', '2'],
 ['2022', 'blue', '3'],
 ['2022', 'red', '4'],
 ['2022', 'red', '5'],
 ['2022', 'red', '6'],
 ['2022', 'red', '7'],
 ['2023', 'green', '8'],
 ['2023', 'green', '9'],
 ['2023', 'green', '10'],
 ['2023', 'green', '11'],
 ['2023', 'yellow', '12'],
 ['2023', 'yellow', '13']]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72956054

复制
相关文章

相似问题

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