在python中创建依赖于前面元素的列表

2024-10-02 12:32:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习python,现在正在研究列表理解。我正在做一个问题,要求生成一个n个元素的列表,其中每个内部列表中的第一个元素表示其索引,下一个n-2个元素是介于1和10之间的随机数,最后一个元素是前面n-2个元素的和,其中值超过5。例如一个样本

[[0, 5, 10, 3, 10], [1, 7, 3, 7, 14], [2, 2, 9, 5, 9]]

我用来生成上述输出的代码是

^{pr2}$

但是,来自Java这样的语言,我倾向于编写如下脚本的代码:

import random
SUM = 0
THRESHOLD = 5
INNER_LIST_SIZE = 5
OUTER_LIST_SIZE = 3
li = []
for y in range(OUTER_LIST_SIZE):
    innerLi = []
    for x in range(INNER_LIST_SIZE):
        if x == 0:
            innerLi.append(y)
        elif x == INNER_LIST_SIZE-1:
            innerLi.append(SUM)
        else:
            rand = random.randint(1,10)
            innerLi.append(rand)
            if rand > THRESHOLD:
                SUM += rand
    li.append(innerLi)
    SUM = 0
print(li)

从python的角度来看,这些解决方案中哪一个看起来更适合解决问题?它们中的任何一个都是我应该如何解决这个问题的吗?如果不是的话,我可以使用哪些其他python工具来解决这个问题?在


Tags: 代码元素列表forsizethresholdrandomli
3条回答

您可以使用列表理解来生成随机数,并将随机数筛选为大于5的随机数。它实际上可以生成非常短的代码。在

import random

def gen_randoms_and_sum(n):
    r_list = [random.randint(1,10) for i in range(n)]
    return r + [sum(x for x in r_list if x>5)]


[[i, *gen_randoms_and_sum(3)] for i in range(3)]
# returns:
[[0, 9, 7, 3, 16], [1, 3, 5, 9, 9], [2, 3, 9, 2, 9]]

我会尽量避免使用所有的helper函数,尤其是因为它们使用global(如果必须使用的话,这不是一个好兆头!)。在

from random import randint

INNER_LIST_SIZE = 5
OUTER_LIST_SIZE = 3
THRESHOLD = 5

li = [[*seq, sum(x for x in seq[1:] if x > THRESHOLD)] for seq in ([idx, *(randint(1, 10) for _ in range(INNER_LIST_SIZE - 2))] for idx in range(OUTER_LIST_SIZE))]

带注释的修饰:

^{pr2}$

您可以使用循环来计算迭代次数,然后使用列表理解和剩余数字的总和:

import random
number_of_randoms_per_list = 5
number_of_lists = 3
my_list = []
for list_count in range(number_of_lists): # number of lists to make
    random_nums = [random.randint(1, 10) for _ in range(number_of_randoms_per_list)]
    temp = [temp for temp in random_nums[-2:] if temp > 5]
    my_list.append([list_count, *random_nums[:], sum(temp)])
print(my_list)

在哪里

  • [random.randint(1, 10) for _ in range(number_of_randoms_per_list)]生成一组随机数(由number_of_randoms_per_list更改)
  • temp = [temp for temp in random_nums[-2:] if temp > 5]使用一个索引[-2:]只从先前生成的随机数列表中获取最后一对数字(并实现一个测试,因此只有当它们大于等于5时才会追加它们)
  • my_list.append([list_count, *random_nums[:], sum(temp)])将我们收集到的所有信息组合成一个列表(通过使用*运算符解压我们的随机数!在

输出:

^{pr2}$

相关问题 更多 >

    热门问题