Wha*_*ame 4 python random list
我有 12 个人,我需要将他们分成 2 个不同的团队。我需要做的是为第一支球队选择 0 到 11 之间的随机 6 个数字,并为第二支球队做同样的事情,没有重叠。执行此操作的最有效方法是什么?
import random
A = random.choice([x for x in range(12)])
B = random.choice([x for x in range(12) if x != A])
C = random.choice([x for x in range(12) if (x != A) and (x != B)])
team1 = random.sample(range(0, 12), 6)
team2 = random.sample(range(0, 12), 6)
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所写的。任何帮助表示赞赏。
您可以使用sets 并设置差异,如下所示:
import random
all_players = set(range(12))
team1 = set(random.sample(all_players, 6))
team2 = all_players - team1
print(team1)
print(team2)
Run Code Online (Sandbox Code Playgroud)
示例输出:
{1, 5, 8, 9, 10, 11}
{0, 2, 3, 4, 6, 7}
Run Code Online (Sandbox Code Playgroud)
虽然使用集合更酷,但您也可以将 12 名玩家的列表打乱并切片:
import random
all_players = list(range(12))
random.shuffle(all_players)
print(all_players[:6])
print(all_players[6:])
Run Code Online (Sandbox Code Playgroud)
输出:
[3, 7, 10, 11, 0, 2]
[4, 8, 5, 6, 9, 1]
Run Code Online (Sandbox Code Playgroud)
特别是如果您需要多次执行此操作,您可以避免一遍又一遍地创建多个集合/列表,而是将一个 12 元素列表作为数据存储。
时间:
import random
for l in range(12,30,2):
def shuffle():
all_players = list(range(l))
random.shuffle(all_players)
return all_players[: l // 2], all_players[l // 2 :]
def sets():
all_players = set(range(l))
team1 = set(random.sample(all_players, l//2))
return team1, all_players - team1
from timeit import timeit
print(l, timeit(shuffle, number=10000))
print(l, timeit(sets, number=10000), "\n")
Run Code Online (Sandbox Code Playgroud)
输出:
12 0.27789219999999994 # shuffle marginally faster
12 0.2809480000000001 # sets
14 0.3270378999999999 # still less memory but slower
14 0.3056880999999998 # sets faster
[...]
26 0.6052818999999996
26 0.4748621000000002
28 0.6143755999999998
28 0.49672119999999964
Run Code Online (Sandbox Code Playgroud)