如何创建一个函数来动态创建一个范围内的元组列表?

时间:2020-02-15 20:45:42

标签: python

有没有一种创建函数的方法,该函数创建带有参数的元组列表:

  • 元组数
  • 每个元组的元素
  • 开始范围
  • 结束范围

我相信我拥有大部分:

import random

def list_rand_num_tuples(num_of_tups, range_beg, range_end):
    list_tuples = [
        (random.randrange(range_beg, range_end),
         random.randrange(range_beg, range_end),
         random.randrange(range_beg, range_end))
        for i in range(num_of_tups)]
    return list_tuples

# test/display it
print(list_rand_num_tuples(3, 0, 51))

但是这部分如何变得更加动态?

(random.randrange(range_beg, range_end),
 random.randrange(range_beg, range_end),
 random.randrange(range_beg, range_end))

例如,是否可以提供length of tuple / elements of tuple参数以使该部分循环适当的次数?

3 个答案:

答案 0 :(得分:3)

您的意思是为每个元组的元素添加一个额外的参数吗?您可以添加另一个范围

def list_rand_num_of_tuples(num_tups, num_elements, range_beg, range_end):
    return [tuple(random.randrange(range_beg, range_end)
                  for _ in range(num_elements))
            for _ in range(num_tups)]

答案 1 :(得分:2)

可能的实现方式可以使用itertools模块中的starmap函数:

import random
import itertools

def list_rand_num_tuples(num_of_tups, range_beg, range_end):
    """
    Generate `num_of_tups` tuples, each containing `num_of_tups` random
    numbers selected from the interval `range_beg..range_end`.
    """
    interval = (range_beg, range_end)
    return [
         tuple(itertools.starmap(random.randrange, [interval] * num_of_tups))
         for _ in range(num_of_tups)
    ]

通过此实现,

>>> list_rand_num_tuples(3, 0, 10)

输出

[(2, 7, 5), (4, 1, 0), (1, 7, 0)]

我个人觉得这比嵌套列表理解更具可读性,并且它利用了专门为此目的设计的标准库功能。

答案 2 :(得分:0)

elem_per_tuple变量添加到函数中。为便于阅读,使用lambda来使嵌套列表理解list_tuples看起来像打结的面条。

import random

def list_rand_num_tuples(num_of_tups, elem_per_tuple, range_beg, range_end):
    rand = lambda: random.randrange(range_beg, range_end)                   
    return [tuple(rand() for _ in range(elem_per_tuple)) for _ in range(num_of_tups)]


print(list_rand_num_tuples(3, 3, 0, 51))

输出:

[(22, 47, 11), (37, 26, 40), (29, 22, 7)]