在Python中动态初始化列表列表

dynamic initialization of list of lists in Python

提问人:bardulia 提问时间:10/31/2023 最后编辑:bardulia 更新时间:10/31/2023 访问量:74

问:

假设我想创建一个函数,该函数采用多个列表的列表,其中整数作为其值,但每个列表可以具有不同的大小。例如,以下列表列表作为输入参数: 但其他输入参数可以是:[[1,2,3,4],[5,6,7],[8,9]][1,2],[3,4,5,6],[7,8,9],[10,11,12,13]

然后我想返回另一个列表列表,其列表数量与输入相同,但每个列表上的元素数量不同,因为我想执行某种算法来删除每个列表的某些元素。

是否可以使用 Python 以动态方式初始化函数内的列表列表?我只能考虑首先创建具有固定大小的固定数量的列表。

python 列表 函数 动态 初始化

评论

0赞 Kelly Bundy 10/31/2023
“我只能考虑先创建固定数量的具有固定大小的列表” - 那会是什么样子?
0赞 bardulia 10/31/2023
@Woodford 不是随机的概率,我的意思是每次函数输入参数都可以不同。
1赞 Woodford 10/31/2023
使用随机数是为了演示如何创建可变大小列表的列表。使用所需的任何固定值。
1赞 Barmar 10/31/2023
“因为我想做某种算法来删除每个列表的某些元素”指的是什么?您指的是输入列表还是您正在创建的列表?为什么这是您需要使用与输入列表不同的大小初始化列表的原因?
1赞 Barmar 10/31/2023
new_list = [[0]*some_algorithm(x) for x in input_list].这使用基于原始列表的算法来生成输出列表。

答:

0赞 BretzelLudique 10/31/2023 #1

假设你有输入a ,并且你想输出以下可能性:input_list:list of listspossibility:list of lists

  • 每个整数input_list
  • 与以下列表数量相同的内部列表:kinput_list

您可以获得 的子列表长度的可能性,然后用 的整数对每个子列表收费。possibilityinput_list

设子列表的长度为 : 。
我们也可以这样写:f = (x_1, x_2, ..., x_k)
设 n 个整数。我们想要每个整数,所以: n = x_0 + x_1 + ... + x_k
我们可以这样说: n = x_0 + (x_1 + ... + x_k) n = x_0 + x_1 + (x_2 + ... + x_k)

等等
我们知道如何解析 n = x_0,所以我们可以使用递归:

possibilityfilling_possibility = [len_1, len_2, ..., len_k]

def resolve_equation(n, k):
    def find_solutions_recursive(target, k, current_solution):
        if k == 1:
            current_solution.append(target)
            solutions.append(tuple(current_solution))
            current_solution.pop()
        else:
            for x in range(target + 1):
                current_solution.append(x)
                find_solutions_recursive(target - x, k - 1, current_solution)
                current_solution.pop()

    solutions = []
    find_solutions_recursive(n, k, [])
    return solutions

input_list = [[1, 2, 3, 4], [5, 6, 7], [8, 9]]
n = sum(map(len, input_list))
k = len(input_list)
filling_possibilities = resolve_equation(n, k)

print(filling_possibilities)

现在我们用 的整数列表的排列来收取 every 的费用。
可以使用 itertools 来描述排列:
filling_possibilityinput_list

import itertools

integers = sum(input_list, [])
integers_distributions = itertools.permutations(integers)

print(list(integers_distributions))

而充电部分,对于相同的整数分布:input_list

filling = filling_possibilities[0]
# Distribute integers to the current `possibility`
possibility = [[] for _ in range(k)]
# the index in the list of integers `integers`
i = 0
for sublist_len, sublist in zip(filling, possibility):
    sublist.extend(integers[i:i+sublist_len])
    i += sublist_len

print(possibility)

全部混合在一起:

import itertools

def resolve_equation(n, k):
    def find_solutions_recursive(target, k, current_solution):
        if k == 1:
            current_solution.append(target)
            solutions.append(tuple(current_solution))
            current_solution.pop()
        else:
            for x in range(target + 1):
                current_solution.append(x)
                find_solutions_recursive(target - x, k - 1, current_solution)
                current_solution.pop()

    solutions = []
    find_solutions_recursive(n, k, [])
    return solutions

def mix_integers(input_list):
    n = sum(map(len, input_list))
    k = len(input_list)
    filling_possibilities = resolve_equation(n, k)
    integers = sum(input_list, [])

    possibilities = []
    for filling in filling_possibilities:
        # `integers_distributions` is exhausted on every iteration (generator)
        integers_distributions = itertools.permutations(integers)
        for distribution in integers_distributions:
            # Distribute integers to the current `possibility`
            possibility = [[] for _ in range(k)]
            # i is the index in the list of integers `distribution`
            i = 0
            for sublist_len, sublist in zip(filling, possibility):
                sublist.extend(distribution[i:i+sublist_len])
                i += sublist_len
            possibilities.append(possibility)
    return possibilities

mixed = mix_integers([[1, 2, 3], [4], [5, 6, 7]])
print(mixed)

但它非常缓慢。您可以尝试使用 .[[1, 2, 3, 4], [5, 6, 7], [8, 9]]