如何在Python中生成50个随机颜色的列表?

6
给定颜色 = [ "红色", "蓝色", "绿色", "黄色", "紫色", "橙色", "白色", "黑色" ],生成并打印出50个随机颜色。你需要使用random模块来获取随机数。使用range和map生成所需数量的数字,然后使用map将数字转换为颜色。打印结果。
这是我收到的问题,以下是我的代码:
colour = [ "red", "blue", "green", "yellow", "purple", "orange", "white", "black" ]

number=random.randint(1,9)

number.range(50)

我假设这段代码创建了一个变量,它从1-9之间随机选择数字,并生成50个随机数?现在我需要一种将这些数字与颜色联系起来的方法...我知道这个问题有点模糊,但如果有人能指点我正确的方向,那就太棒了!
5个回答

11

如果你想要n个随机的十六进制颜色,可以尝试这个方法:

import random
get_colors = lambda n: ["#%06x" % random.randint(0, 0xFFFFFF) for _ in range(n)]
get_colors(3) # sample return:  ['#8af5da', '#fbc08c', '#b741d0']

8
你需要做的是使用random.choice(seq)50次,将colour列表作为参数传递。

像这样:

 rand_colours = [random.choice(colour) for i in range(50)]

random.choice(seq) 从序列 seq 中随机返回一个元素。


不错!是否有类似于Haskell的replicatereplicateM的等效函数,可以对表达式进行多次求值,并将结果返回为列表? - danr
@danr 我认为没有直接的等价物。Python教程提供了如何使用itertools.starmap重复调用函数n次的示例。它甚至在repeatfunc中使用了random.random。无论如何,使用for循环似乎是最简单的方法。 - soulcheck

3

由于某些原因,您的问题需要使用 map。这种操作通常只需要一行代码,因此直接给出答案有些困难。首先,使用 maprange 获取所需范围内的随机数列表:

>>> nums = map(lambda x : random.randint(0,7), range(50))
>>> nums
[6, 6, 2, 4, 7, 6, 6, 7, 1, 4, 3, 2, 6, 1, 1, 2, 2, 0, 7, 
3, 6, 1, 5, 2, 1, 2, 6, 0, 3, 0, 2, 6, 0, 6, 3, 5, 0, 7, 
2, 5, 4, 1, 0, 0, 1, 4, 3, 3, 0, 3]

注意 lambda 的参数 x 没有被使用。这就是我不会在这里使用 map 的至少一个原因。然后,使用数字列表,将索引函数映射到数字上以获得颜色列表:

>>> cols = map(lambda i: colour[i], nums)
>>> cols
['white', 'white', 'green', 'purple', 'black', 'white', 'white', 
'black', 'blue',     'purple', 'yellow', 'green', 'white', 
'blue', 'blue', 'green', 'green', 'red', 'black', 'yellow', 
'white', 'blue', 'orange', 'green', 'blue', 'green', 'white', 
'red', 'yellow', 'red', 'green', 'white', 'red', 'white', 
'yellow', 'orange', 'red', 'black', 'green', 'orange', 'purple', 
'blue', 'red', 'red', 'blue', 'purple', 'yellow', 'yellow', 'red', 
'yellow']

使用列表推导式中的random.choice(),soulcheck给出的答案是迄今为止确定答案的最佳方法。


太好了,我同意另一种方法更容易,但显然这是我需要的方式!谢谢你的帮助! - Carla Dessi

1
你可以使用一个简单的列表推导式来实现这个功能:
[ colour[random.randint(0,len(colour)-1)] for x in range(0,50) ]

colour[i] 表示 colour 列表中的第 i 个元素。使用您建议的 random.randint,从 0 到列表长度减一(len(colour)-1)之间创建一个随机整数。这将在 range(1,50) 中重复 50 次。列表推导式中的虚拟迭代器值 x 只是被忽略了。

希望这可以帮助您!


random.choice可以做到这一点...而且range(1, 50)只有49个选择。 - Gandaro

0

获取50个十六进制颜色值的另一种解决方案:

def random_color():
    return "#{}{}{}{}{}{}".format(*(random.choice("0123456789abcdef") for _ in range(6)))

colors = [random_color() for _ in range(50)]
print(*colors)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接