Python随机化,但每两个元素重复一个元素

2024-04-19 22:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试对一个列表进行洗牌,其中一些元素每两个元素重复一次

我有一个包含重复元素的列表,如下所示:

mylist=[AAA,B,C,D,E,F]

我想随机洗牌列表,但要确保所有重复的元素都是彼此分开的两个元素,如下面的一个

mylist=[A,B,C,A,D,E,A,F]

到目前为止,我只找到了下面的代码来检查两个元素是一个接一个地重复还是分开一个元素,但我不知道如何确保它们正好分开两个元素

for i in range(len(mylist)):
      if mylist[i] == mylist[i+1] or mylist[i] == mylist[i+2]:
      mylist.append(mylist.pop(i))

Tags: or代码in元素列表forlenif
1条回答
网友
1楼 · 发布于 2024-04-19 22:19:58

您可以自己实现shuffle函数,并将项目作为组放置在结果列表中。每个项目的位置应在剩余位置内相隔2步。请注意,这可能会导致没有空间放置一组项目的情况,因此您需要循环,直到找到有效的洗牌。从最大到最小的分组处理应该比仅仅检查随机洗牌要快得多

from random import choice
from collections import Counter

def shuffle(arr,step=3):
    counts    = Counter(arr)              # number of repetitions of each letter
    result    = [None]*len(arr)           # will fill positions as we go
    positions = set(range(len(arr)))      # unfilled positions
    while positions:                     
        for v,count in counts.most_common(len(counts)):  # largest to smallest
            ranges = (range(i,i+count*step,step) for i in range(0,len(mylist)-count+1))
            available = [r for r in ranges if positions.issuperset(r)]
            if not available:
               positions = set(range(len(arr)))  # no room left for group 
               break                             # try again
            for p in choice(available):          
                result[p] = v             # fill group positions
                positions.discard(p)      # remove from remaining positions
    return result

输出:

mylist = ["A", "A", "A", "B", "C", "D", "E", "F"]

print(shuffle(mylist))    
# ['A', 'C', 'E', 'A', 'B', 'F', 'A', 'D']
print(shuffle(mylist))
# ['A', 'D', 'C', 'A', 'F', 'E', 'A', 'B']
print(shuffle(mylist))
# ['B', 'A', 'D', 'F', 'A', 'C', 'E', 'A']


mylist = ["A", "A", "A", "B", "C", "D", "E","E","E", "F","B","B","B","B"]

print(shuffle(mylist))
# ['C', 'B', 'F', 'A', 'B', 'E', 'A', 'B', 'E', 'A', 'B', 'E', 'D', 'B']
print(shuffle(mylist))
# ['B', 'D', 'E', 'B', 'C', 'E', 'B', 'A', 'E', 'B', 'A', 'F', 'B', 'A']
print(shuffle(mylist))
# ['B', 'C', 'A', 'B', 'E', 'A', 'B', 'E', 'A', 'B', 'E', 'F', 'B', 'D']

相关问题 更多 >