在python中创建依赖于先前元素的列表
我正在学习python,现在正在进行列表理解。我正在做一个问题,要求生成一个包含n个元素的列表,其中每个内部列表中的第一个元素表示其索引,接下来的n-2个元素是1到10之间的随机数,最后一个元素是值超过5的前n-2个元素的总和。例如,一个样本在python中创建依赖于先前元素的列表,python,list-comprehension,Python,List Comprehension,我正在学习python,现在正在进行列表理解。我正在做一个问题,要求生成一个包含n个元素的列表,其中每个内部列表中的第一个元素表示其索引,接下来的n-2个元素是1到10之间的随机数,最后一个元素是值超过5的前n-2个元素的总和。例如,一个样本 [[0, 5, 10, 3, 10], [1, 7, 3, 7, 14], [2, 2, 9, 5, 9]] 我用来生成上述输出的代码是 import random SUM = 0 def genRandNum(): global SUM
[[0, 5, 10, 3, 10], [1, 7, 3, 7, 14], [2, 2, 9, 5, 9]]
我用来生成上述输出的代码是
import random
SUM = 0
def genRandNum():
global SUM
x = random.randint(1,10)
if(x > 3):
SUM = SUM + x
return x
def finalEle():
global SUM
ret = SUM
SUM = 0
return ret
INNER_LIST_SIZE = 5
OUTER_LIST_SIZE = 3
li = [[y if x == 0
else finalEle()if x == INNER_LIST_SIZE - 1
else genRandNum()
for x in range(INNER_LIST_SIZE)] for y in range(OUTER_LIST_SIZE)]
print(li)
然而,来自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工具来解决这个问题?您可以使用循环来计算迭代次数,然后使用列表理解,然后对剩余的数进行求和:
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)表示范围内的随机数(每个列表的随机数)]
)每个列表的随机数进行更改
使用索引[-2:]仅从先前生成的随机数列表中获取最后两个数字(并执行测试,因此仅当它们大于5时才会追加)temp=[temp for temp in random_nums[-2:]如果temp>5]
将我们收集的所有信息合并到一个列表中(通过使用my\u list.append([list\u count,*random\u nums[:],sum(temp)])
操作符解压随机数*
[[0, 1, 3, 5, 8, 5, 8], [1, 8, 5, 4, 4, 3, 0], [2, 4, 3, 8, 6, 10, 16]]
我会尽量避免使用所有的helper函数,特别是因为它们使用
全局
(如果必须使用它,这不是一个好迹象!)
美化,附评论:
li = [
# append the sum at the end
[*seq, sum(x for x in seq[1:] if x > THRESHOLD)]
# iterate through a generator that generates sequences of [index] + [random ints]
for seq in (
# list with [index, randint1, randint2, randint3, ...]
[idx, *(randint(1, 10) for _ in range(INNER_LIST_SIZE - 2))]
for idx in range(OUTER_LIST_SIZE)
)
]
您可以使用列表理解来生成随机数,并将随机数过滤为大于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]]
所以,我猜如果他们要求你在练习中使用列表理解,他们希望你内联定义列表: 尽管你的解决方案可能有效,但它们可能不是问题的制定者所寻求的
def build_list(number_of_randoms=3, outer_list_size=3, threshold=5):
rands = [[random.randint(1, 10) for _x in range(number_of_randoms)] for _y in range(outer_list_size)]
return [[index] + [n for n in numbers] + [sum(x for x in numbers if x > threshold)] for index, numbers in enumerate(rands)]
我在上面写了一个相当粗糙的函数,但它应该可以帮助您了解我认为他们在寻找什么。我认为关键是在两者之间有一个动态的随机数。有没有一种方法可以不调用sum函数就完成这段代码?我之所以这样问,是因为我相信sum会遍历整个列表ter r_列表已经创建,所以当内部列表大小和外部列表大小变大时,将需要2倍的时间。这是我甚至应该担心的问题,因为它们都是O(内部列表大小*外部列表大小)?
def build_list(number_of_randoms=3, outer_list_size=3, threshold=5):
rands = [[random.randint(1, 10) for _x in range(number_of_randoms)] for _y in range(outer_list_size)]
return [[index] + [n for n in numbers] + [sum(x for x in numbers if x > threshold)] for index, numbers in enumerate(rands)]