考虑“挑选”嵌套列表的过程。拣配定义如下:
- 如果参数是列表,则从列表中随机(均匀地)选取一个元素,然后从中选择一个元素。
- 如果参数不是列表,则只需将其返回即可。
Python中的示例实现:
import random
def pick(obj):
if isinstance(obj, list):
return pick(random.choice(obj))
else:
return obj
为简单起见,我们假定嵌套列表仅包含整数或其他嵌套列表。
给定任何列表,就有可能创建一个扁平化的版本,该版本无法通过来区分pick
,即从中进行选择会以相同的概率产生相同的结果。
例如,“拼合”列表
[1, 2, [3, 4, 5]]
产生清单
[1, 1, 1, 2, 2, 2, 3, 4, 5]
。简单展平是无效的原因是,子列表的元素被选择的可能性较低,例如,列表中[1, [2, 3]]
的1被选择的可能性为2/4 = 1/2,而3和4的被选择的可能性为1/4每个机会。
还要注意,从单例列表中进行选择等同于从其元素中进行选择,而从空列表中进行选择则没有任何意义。
挑战
给定一个嵌套的非负整数列表,返回一个扁平化的非负整数列表,从中进行拾取会以相同的概率产生相同的结果。
这是代码高尔夫球,因此最短的有效答案(以字节为单位)获胜。
技术指标
- 输入
[2, 3, 4]
,[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
和[2, [3, 3], [[4]]]
是等效的(即,它们应给出等效的结果)。 - 输出
[2, 2, 2, 2, 3, 3, 3, 3]
和[2, 3]
是等效的(即可以输出任何一个)。 - 您可以假设列表中仅包含1至100的数字。
- 您可以假定顶级输入将是一个列表,即
2
不是有效的输入。 - 您可以使用嵌套列表中的任何合理的表示,例如:
[1, [2, 3]]
,1 {2 3}
,"[ 1 [ 2 3 ] ]"
等。 - 除了列表以外,还可以输出多集或映射,或者,由于仅允许1-100范围内的数字,因此可以输出长度为100的表示数量的整数列表。
测试用例
请注意,列出的输出只是一种有效的可能性。请参阅有关构成有效输入或输出的规范。
format:
input -> output
[3] -> [3]
[1, [1, 1]] -> [1]
[1, [2, 3]] -> [1, 1, 2, 3]
[2, 3, [4, [5, 5, 6], 6, 7]] -> [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7]
[[1, 1, 2], [2, 3, 3]] -> [1, 2, 3]
[[1, 1, 2], [2, 3, 3, 3]] -> [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3]