【问题标题】:No repeats in a for loop with random.sample [duplicate]在带有 random.sample 的 for 循环中没有重复 [重复]
【发布时间】:2019-12-28 04:32:25
【问题描述】:

我有以下几点:

list1 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]

for i in range(3):
        print(random.sample(list1, k=1))
        print(random.sample(list1, k=1))
        print(random.sample(list1, k=1))

我正在寻找类似的东西:

['a', 'g', 'i']
['c', 'h', 'b']
['k', 'd', 'e']

想法是在任何地方都没有重复。

我知道如果不使用循环,我可以对列表进行切片,但不确定如何处理所涉及的循环。

【问题讨论】:

    标签: python


    【解决方案1】:

    只需随机播放并获取后续切片:

    list1 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
    random.shuffle(list1)
    
    N = 3
    
    for i in range(0, len(list1)-N+1, N):
        print(list1[i:i+N])
    
    #['c', 'b', 'd']
    #['i', 'e', 'j']
    #['h', 'g', 'f']
    

    【讨论】:

    • 效果很好。如果列表中的字符串数量发生变化,有没有办法自动调整 range() 以适应这种变化?
    • 是的,检查编辑。
    【解决方案2】:

    打乱列表然后将其拆分:

    import random
    
    list1 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
    random.shuffle(list1)
    for i in range(0, len(list1), 3):
        print(list1[i:i+3])
    

    【讨论】:

    • 天哪,我们放了完全相同的东西 :) +1 表示敏捷
    • @A.J.Uppal 你也一样 :) 这是最好的方法
    【解决方案3】:

    您还可以使用原始示例函数并使用列表推导对列表进行切片:

    list1 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
    
    output = random.sample(list1, k=9)
    output = [output[i:i+3] for i in range(0,9,3)]
    

    【讨论】:

      【解决方案4】:

      输入:

      import random
      list1 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
      
      for i in range(3):
        print([list1.pop(random.choice(range(len(list1)))) for i in range(3)])
      

      输出:

      ['j', 'g', 'b']
      ['f', 'c', 'h']
      ['e', 'k', 'i']
      

      【讨论】:

        【解决方案5】:
        >>> list1 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
        >>> mylist = random.sample(list1, k=9)
        >>> print([mylist[i:i+3] for i in range(0, 9, 3)])
        

        输出 [['e', 'b', 'i'], ['k', 'h', 'd'], ['j', 'f', 'a']]

        【讨论】:

        • 这个答案和杰的一样。当我发布此内容时,我没有看到 Jay 的答案,因为我正忙于寻找自己的答案。
        猜你喜欢
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多