Python: Random from multiple lists, no repeats
本问题已经有最佳答案,请猛点这里访问。
假设我有4个列表,每个列表有10个不同的选项,我想从四个列表中选择一个项目,用户指定的次数。但没有重复的输出。这有可能吗?我似乎写不出任何不会重复输出的东西。
假设我们有这些
1 2 3 | >>> lists = [range(10*i, 10*(i+1)) for i in range(4)] >>> lists [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]] |
首先,洗牌:
1 2 3 4 | >>> for lst in lists: random.shuffle(lst) >>> lists [[6, 8, 2, 1, 3, 5, 9, 0, 7, 4], [17, 12, 16, 10, 14, 15, 18, 11, 13, 19], [20, 28, 23, 21, 27, 25, 24, 29, 26, 22], [35, 32, 38, 31, 39, 34, 30, 33, 36, 37]] |
然后用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> for items in zip(*lists): print(items) (6, 17, 20, 35) (8, 12, 28, 32) (2, 16, 23, 38) (1, 10, 21, 31) (3, 14, 27, 39) (5, 15, 25, 34) (9, 18, 24, 30) (0, 11, 29, 33) (7, 13, 26, 36) (4, 19, 22, 37) |
如果您只需要指定的数量,只需使用
1 2 3 4 5 6 7 8 9 10 | >>> from itertools import islice >>> for items in islice(zip(*lists),5): print(items) (6, 17, 20, 35) (8, 12, 28, 32) (2, 16, 23, 38) (1, 10, 21, 31) (3, 14, 27, 39) |
1 2 3 | population = [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1] population = set(population) samples = random.sample(population, 3) |
这样的方法应该有效:
1 2 3 4 5 6 7 8 9 10 | a,b,c,d = initialize_lists() output_picked_before = set() n = number_of_experiments() for i in range(n): t = pick_random_combination_from_list(a,b,c,d) while t in output_picked_before: t = pick_random_combination_from_list(a,b,c,d) print t output_picked_before.add(t) |