如何将列表分成两个随机部分

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)

这是我到目前为止所写的。任何帮助表示赞赏。

Ada*_*Er8 9

您可以使用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)

  • 这是一个相当优雅的解决方案,虽然我不确定在这里使用“集合”有什么好处,但可以使用简单的列表理解来将 A 团队的成员从 B 团队中过滤掉。 (2认同)
  • @adirio 速度是不同的 - 对于 12 个元素来说,这是没有意义的 - 列表可能会一样快(并且内存方面更便宜),但是如果有 10**6 个元素,列表比较将需要更长的时间。不确定不使用集合的就地随机播放是否会比使用集合更快或更慢 - 但它会更有效地存储:) (2认同)

Pat*_*ner 8

虽然使用集合更酷,但您也可以将 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)