Py学习  »  Python

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

mradey • 5 年前 • 1790 次点击  

我正在学习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
    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工具来处理这个问题?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38909
 
1790 次点击  
文章 [ 4 ]  |  最新文章 5 年前
JohnGalt
Reply   •   1 楼
JohnGalt    6 年前

所以,我猜如果他们要求你在练习中使用列表理解,他们希望你直接定义列表:

List comprehensions Docs

尽管你的解决方案可能有效,但它们可能不是问题的制定者想要的。

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)]

我在上面写了一个相当粗糙的函数,但它应该能帮助您了解我认为他们在寻找什么。

Reedinationer
Reply   •   2 楼
Reedinationer    6 年前

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

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] 使用index[-2:]仅从以前生成的随机数字列表中获取最后两个数字(并执行测试,以便仅在它们为>5时追加它们)
  • my_list.append([list_count, *random_nums[:], sum(temp)]) 将我们收集的所有信息组合在一起,并将其组装成一个列表(通过将随机数与 * 接线员!

输出:

[[0, 1, 3, 5, 8, 5, 8], [1, 8, 5, 4, 4, 3, 0], [2, 4, 3, 8, 6, 10, 16]]
iz_
Reply   •   3 楼
iz_    6 年前

我会尽量避免所有助手函数,特别是因为它们使用 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))]

带评论的美化:

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)
    )
]
James
Reply   •   4 楼
James    6 年前

您可以使用列表理解来生成随机数,并将随机数筛选为总和大于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]]