在以下代码中:
a = [["2022"], ["2023"]]
b = [["blue", "red"], ["green", "yellow"]]
c = [["1", "2", "3"], ["4", "5", "6", "7"], ["8", "9", "10", "11"], ["12", "13"]]我想要一个输出这一点的函数,但是对于任意数量的变量:
[
["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来完成这个任务,但是还没有找到任何东西。
为了澄清这一点,我的用例是迭代嵌套/多级下拉菜单的值(第一个下拉菜单返回选项,每个选项返回不同的下拉菜单,等等)。
发布于 2022-07-12 17:31:20
首先,将第一个参数加入到一个列表中,每个列表中只有一个元素。
然后,对于下一个参数中的每个sublist及其索引i,您将选择前一个迭代res[i]的第一个列表,并将其添加到aux len(子列表)列表中,每个列表都是带有来自sublist的一个项的res[i]。
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此外,如果要验证传递给函数的参数是否正确,可以使用以下方法:
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发布于 2022-07-12 18:03:56
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']]发布于 2022-07-13 16:31:33
就像D.B的答案,但是使用reduce和列表理解:
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))输出(在网上试试!):
[['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']]https://stackoverflow.com/questions/72956054
复制相似问题