【问题标题】:How to pick a random item within a list while two lists are being considered?在考虑两个列表时如何在列表中选择一个随机项目?
【发布时间】:2014-04-22 17:49:02
【问题描述】:

抱歉,我找不到更好的标题。我的问题是我有两个列表,我想从第一个列表中随机选择一个项目并将其与第二个列表中的一个项目匹配,但是这些项目的索引不能相同(li1[3] 不能与 li2[3] 匹配) 并且在选择一个项目后,它必须从列表中删除。我试过这段代码,但它没有完成工作。谢谢你的帮助。

from random import choice

teams1 = ["brazil", "croatia", "england", "italy", "mexico", "cameroon", "ivory coast", "japan"]
teams2 = ["spain", "germany", "belgium", "holland", "argentina", "portugal", "france", "usa"]


counter = 3
counter2 = 8 
while counter != 0:
    a = choice(range(1,counter2))
    a1 = teams1[a]
    b = choice(range(1,counter2))
    b1 = teams2[b]
    print(teams1[0], b1)
    print(teams2[0], a1)
    del teams1[a]
    del teams2[b]
    del teams1[0]
    del teams2[0]
    counter -= 1
    counter2 -= 2

print(teams1[0], teams2[0])

【问题讨论】:

  • 我不明白你所说的被选择项目的索引是什么意思不能相同。它们是从列表中删除所选项目之后的索引还是原始列表中的索引?
  • 对不起,我一开始没有搞清楚。基本上问题是,例如,即使原始列表已修改,意大利也永远无法与荷兰配对,克罗地亚永远无法与德国配对。
  • 我认为这不能完全随机完成,因为有时球队是按顺序挑选的,这样每个列表中剩下的最后一个就是需要避免的比赛。发生这种情况时,您必须从头开始重新绘制。那是你想做的吗?我不知何故感觉到,您构建匹配项的方式并不完全是您需要做的,但我不知道您要解决的真正问题。
  • 队伍从八个不同的组中晋级。每组有两支队伍晋级。一个来自一号点,两个来自二号点。比方说,第一组推广 1.Brazil 和 2.Spain,第二组推广 1.Croatia 和 2.Germany 等。巴西无法与西班牙会面,因为他们已经在一个组中,无法与其他已从第一名升级的球队。这就是我想在这里弄清楚的。

标签: python list random choice


【解决方案1】:

您可以使用random.randrange

import random

teams1 = ["brazil", "croatia", "england", "italy", "mexico", "cameroon", "ivory coast", "japan"]
teams2 = ["spain", "germany", "belgium", "holland", "argentina", "portugal", "france", "usa"]

t1 = random.randrange(0, len(teams1))
t2 = random.randrange(0, len(teams2))

while t2 == t1:
    t2 = random.randrange(0, len(teams2))

rand_choice1 = teams1.pop(t1)
rand_choice2 = teams1.pop(t2)

while 循环防止两个索引相同,列表的 .pop() 内置方法会删除我们从列表中选择的团队。

这种方法只列出一个对局,但它可以很容易地变成一个随机匹配所有球队的函数。

【讨论】:

    【解决方案2】:

    你的程序是对的。除非您的程序在任一列表中仍有值时退出。那是因为您的 counter 命中 0 并且条件:

    while counter != 0:
    

    不再持有。

    您可以使用以下方法更改该条件以检查任一列表中是否没有更多项目:

    while len(teams1) and len(teams2):
    

    或:

    while counter > -1:
    

    去掉最后一行:

    print(teams1[0], teams2[0])
    

    您的程序按预期运行。

    【讨论】:

      【解决方案3】:

      如果有一种更优雅的方式来构建对组合,我不会感到惊讶,但这似乎与问题 cmets 中已阐明的内容有关:

      #/usr/bin/env python2.7
      from random import shuffle
      
      def main():
      
          teams1 = ["brazil", "croatia", "england", "italy",
                    "mexico", "cameroon", "ivory coast", "japan"]
          teams2 = ["spain", "germany", "belgium", "holland",
                    "argentina", "portugal", "france", "usa"]
      
          excluded_pairs = dict(zip(teams1, teams2))
          shuffle(teams1) # not really needed
          shuffle(teams2)
      
          while len(teams1):
              t1 = teams1.pop()
              if len(teams1) > 1:
                  if teams2[-1] != excluded_pairs[t1]:
                      t2 = teams2.pop(-1)
                  else:
                      t2 = teams2.pop(-2)
              elif len(teams1) == 0:
                  t2 = teams2.pop(-1)
              elif len(teams1) == 1:
                  if (teams2[-1] != excluded_pairs[t1]
                      and teams2[-2] != excluded_pairs[teams1[0]]):
                      t2 = teams2.pop(-1)
                  else:
                      t2 = teams2.pop(-2)
      
              print '{} vs. {}'.format(t1, t2)
      
          print len(teams1)
          print len(teams2)
      
      if __name__ == '__main__':
          main()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 2012-09-11
        • 2021-08-25
        • 2022-01-15
        • 2011-11-14
        • 1970-01-01
        相关资源
        最近更新 更多