Создание списков в Python, которые зависят от предыдущих элементов - PullRequest
3 голосов
/ 29 марта 2019

Я изучаю Python и сейчас работаю над пониманием списка.Я делаю задачу, которая просит создать список списков из n элементов, где первый элемент в каждом внутреннем списке представляет свой индекс, следующие n-2 элемента являются случайными числами от 1 до 10, а последний элемент является суммойпредыдущие n-2 элементов, где значение было больше 5. Например, образец будет

[[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 я мог бы использовать для этого?

Ответы [ 4 ]

1 голос
/ 29 марта 2019

Вы можете использовать списки для генерации случайных чисел и фильтрации случайных чисел до тех, которые больше 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]]
0 голосов
/ 29 марта 2019

Итак, я полагаю, если они просят вас использовать понимание списков для упражнения, они хотят, чтобы вы определяли списки встроенными:

Список документов 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)]

Я написал довольно грубую функцию выше, но она должна помочь вам понять, что, по-моему, они ищут.

0 голосов
/ 29 марта 2019

Я бы постарался избежать всех вспомогательных функций, тем более что они используют 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)
    )
]
0 голосов
/ 29 марта 2019

Вы можете использовать цикл для подсчета итераций и понимания списка, за которым следует сумма для остальных чисел:

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)]) объединяет всю собранную информацию и собирает ее в список (распаковывая наши случайные числа с оператором *!

Выходы:

[[0, 1, 3, 5, 8, 5, 8], [1, 8, 5, 4, 4, 3, 0], [2, 4, 3, 8, 6, 10, 16]]
...