当前位置: 首页 > 知识库问答 >
问题:

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

堵毅然
2023-03-14

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

以我正在研究的这个例子为例:使用python,我想随机生成两个独特的运动队(team1team2,每个队有5名球员),从可用球员的组合列表中相互比赛(players\u available,总共10名球员)。

players_available是手动预定义的,存在于玩家名字列表中,如'Tom','Lucy'

我将如何在python中执行此操作?我已经从主列表中打印了两个唯一的列表,但我不确定应用规则的最佳方法

# 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原则(即如果/elif语句的负载?)和核心python库(尽可能少最好)。

共有1个答案

都才俊
2023-03-14

你可以把列表洗牌,拿上半场,对照你的规则检查一下。如果所有规则返回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']
 类似资料:
  • 问题内容: 假设我有以下列表: 从此列表中随机检索项目的最简单方法是什么? 问题答案: 采用 对于加密安全的随机选择(例如,用于从单词列表生成密码短语),请使用 secrets是Python 3.6中的新功能,在旧版本的Python上,你可以使用此类:

  • 我正在尝试在AWS中应用身份池策略。我正在使用awc cli设置策略,但标题中经常出现以下例外情况: 调用AttachPrincipalPolicy操作时发生错误(InvalidRequestException):检测到1个验证错误:“policyName”处的值“DeviceShadowPolicy”未能满足约束:成员必须满足正则表达式模式:[\w=,。@-] 这是我使用的命令: 我不明白为什么

  • 问题内容: 我有一个包含约50,000行的SQL Server表。我想随机选择大约5,000行。我想到了一种复杂的方法,用“随机数”列创建一个临时表,将我的表复制到该表中,遍历该临时表并用来更新每一行,然后从该表中选择随机数列< 0.1。我正在寻找一种更简单的方法,如果可能的话,可以在一个语句中进行说明。 本文建议使用该功能。这看起来很有希望,但是我看不到如何可靠地选择一定百分比的行。 有人做过吗

  • 问题内容: 如何从Java列表中随机选择一个项目?例如我有 等等…。如何使用 问题答案: 像这样吗

  • 问题内容: 我打印出列表的内容,并得到以下输出: 这些奇怪的点是什么? 我用的是python 2.7.3 问题答案: 可能是您不小心建立了一个列表,其中包含对自身的引用(或此处有很多引用): 使用三个点使字符串表示不会在递归中淹没。您可以使用和运算符进行验证: