Python:从列表中打印 n 个随机项目,但输出必须满足多个规则

标签 python zebra-puzzle

<分区>

在 python 中,我想从较大的字符串列表中打印较小的随机选择字符串列表,返回 n 个项目。但是,生成的较小列表必须应用条件,以便某些项目不能一起存在于新的较小列表中。

以我正在研究的这个例子为例:我想使用 python 随机生成 2 个独特的运动队(team1team2,每队有 5 名球员)进行比赛从可用玩家的组合列表中相互对抗(players_available,总共 10 个玩家)。

players_available 是手动预定义的,作为玩家名称列表存在,例如“Tom”、“Lucy”和“James”。但是,'Tom' 和 'James' 不能存在于同一个团队中(因为,例如,他们都太棒了,不能在同一个团队中打球!)。总共有大约 10 条规则。

我将如何在 python 中执行此操作?我已经设法从主列表打印 2 个唯一列表,但我不确定将规则和条件应用于 2 个输出列表的最佳方法。这是我所在的位置:

# Sports match team selection script (2 teams of 5 players each team)
import random

# available players (always an even number of items in this list. Could be 10, 12 or 14)
players_available = ['Tom', 'Lucy', 'James', 'Josh', 'Steve', 'Mike', 'Darren', 'Joe', 'Delia', 'Gordon']

# number of players required per team (will always be half the number of players available)
n = 5

# current top 2 players (manually chosen)
best1 = 'Steve'
best2 = 'Mike'

# selection rules (only written here as descriptive strings for clarity. NOT currently implemented in team selection code below! How would I do this properly?)
rule1 = 'Tom and James cant be on the same team'
rule2 = 'Josh must be on the same team as Gordon'
rule3 = 'best1 and best2 cant be on the same team'
# etc etc... until rule 10 (there'll be no more than 10 rules)

# generate team 1
team1 = random.sample(players_available, n)
print(team1)

# remaining players
players_remaining = players_available
for player in team1:
    if player in players_remaining:
        players_remaining.remove(player)

# create team 2
team2 = players_remaining
print(team2)

我不是 Python 专家,所以我正在尝试使用基本的 Python 原则(即大量 if/elif 语句?)和核心 Python 库(最好尽可能少)找出解决方案。

最佳答案

您可以将列表洗牌,取前半部分并根据您的规则进行检查。如果所有规则都返回 True,您可以停止洗牌。

这种方法非常基础,不太可能适用于大量玩家和规则,因为您不会在每次洗牌后从池中消除玩家。然而,由于尺寸小和限制有限,这不是问题。

import random

def rules(team):
    separate = ['Tom','James']
    together = ['Josh','Gordon']
    best = ['Steve','Mike']
    
    s = sum([x in team for x in separate]) == 1
    t = all([x in team for x in together]) or not all([x in team for x in together])
    b = sum([x in team for x in best]) == 1
    return s & t & b


players_available = ['Tom', 'Lucy', 'James', 'Josh', 'Steve', 'Mike', 'Darren', 'Joe', 'Delia', 'Gordon']

while True:
    random.shuffle(players_available)
    t1 = players_available[:5]
    t2 = players_available[5:]
    if rules(t1):
        break
        
        
print(t1,t2, sep='\n')

输出

['Lucy', 'Mike', 'James', 'Joe', 'Gordon']
['Delia', 'Steve', 'Tom', 'Josh', 'Darren']

关于Python:从列表中打印 n 个随机项目,但输出必须满足多个规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70350891/

相关文章:

prolog - 列表中的唯一元素(Prolog)

prolog - 在 Prolog 中解决逻辑难题

Prolog puzzle baker、meatman 和 carpenter

python - Django-Docker-应用程序默认凭据不可用

python - 通过给定函数将点分配给对象

prolog - 爱因斯坦谜语序言

python - 如何通过 tweepy 将流式推文保存在 json 中?

python - 尽管指定了 `device_count={' CPU' : 1, 'GPU' : 0}`?,为什么 TensorFlow session 由于 GPU 内存不足错误而无法启动

python - 是否有像 numpy.clip(a, a_min, a_max) 这样的函数,其中 a_min 和 a_max 之外的值被包裹而不是饱和?