在Python中生成子组

在Python中生成子组,python,list,Python,List,假设我有一个如下的列表,它表示四个组(a、B、C和D)。假设列表中的每个元素都表示一个人。所以第一个人在A组,第二个人在B组,第三个人在D组,依此类推 [“A”、“B”、“D”、“C”、“B”、“C”、“A”、“B”、“A”、“C”、“A”、“D”、“A”、“D”、“D”、“A”] 每个字母表的出现次数始终为3的倍数。请注意,B和C各出现三次,而A出现六次 我想把这四个组分为四个随机子组。所需输出的示例: [“A1”、“B2”、“D2”、“C1”、“B1”、“C3”、“A2”、“B3”、“A3”

假设我有一个如下的列表,它表示四个组(a、B、C和D)。假设列表中的每个元素都表示一个人。所以第一个人在A组,第二个人在B组,第三个人在D组,依此类推

[“A”、“B”、“D”、“C”、“B”、“C”、“A”、“B”、“A”、“C”、“A”、“D”、“A”、“D”、“D”、“A”]

每个字母表的出现次数始终为3的倍数。请注意,B和C各出现三次,而A出现六次

我想把这四个组分为四个随机子组。所需输出的示例:

[“A1”、“B2”、“D2”、“C1”、“B1”、“C3”、“A2”、“B3”、“A3”、“C2”、“A2”、“D3”、“A3”、“D1”、“A1”]

这里,A1是一个子组,与A2和A3不同。A2也不同于A3。其余的也一样。请注意,以相同字母开头的所有子组的大小必须相同。因此,A1、A2和A3具有相同数量的元件,但B1可以具有与A1不同数量的元件

所需输出的另一个示例(因为子组的分配是随机的):

[“A2”、“B3”、“D2”、“C1”、“B2”、“C3”、“A3”、“B1”、“A1”、“C2”、“A2”、“D1”、“A1”、“D3”、“A3”]


如何执行此操作?

我不确定您是否希望执行此操作,但此脚本将数组中的每个字符分配给不同的子组。您可以在此处进行测试:


我不确定这是否是您想要做的,但是这个脚本将数组中的每个字符分配给不同的子组。您可以在此处进行测试:


下面将生成随机子组,其中给定字符的每个子组大小相同;i、 例如,对于所提供的列表,如果主要组有六个元素
A
,则正好分别有两个元素
A1
A2
A3
。类似地,对于大小为3的其他主要组,最终输出中每个子组中正好有一个元素

from collections import Counter
from random      import randint

element_counter = Counter()

n = 3 # The number of subgroups to produce: the LCM of the size of each group.

groups = ["A", "B", "D", "C", "B", "C", "A", "B", "A", "C", "A", "D", "A", "D", "A"]

# Counts the number of elements in each group.
for element in groups:

    element_counter[element] += 1

subscripts = {key : None for key in element_counter}

# Produces a list of possible subscripts: e.g., [1, 1, 2, 2, 3, 3],
# such that each subgroup of a given group is the same size.
for key in element_counter:

    size = element_counter[key]

    subscripts[key] = [x for x in range(1, n + 1) for y in range(size // n)]

subgroups = []

# Draws and removes a random subscript from the list of subscripts for each
# group member to generate the subgroups.
for element in groups:

    random_number = randint(0, len(subscripts[element]) - 1)

    subgroups.append("{}{}".format(element, subscripts[element].pop(random_number)))

print("Before:\t{}".format(groups))
print("After:\t{}".format(subgroups))

样本输出:

运行1:

Before: ['A', 'B', 'D', 'C', 'B', 'C', 'A', 'B', 'A', 'C', 'A', 'D', 'A', 'D', 'A']
After:  ['A2', 'B3', 'D3', 'C1', 'B2', 'C2', 'A1', 'B1', 'A3', 'C3', 'A2', 'D2', 'A1', 'D1', 'A3']
运行2:

Before: ['A', 'B', 'D', 'C', 'B', 'C', 'A', 'B', 'A', 'C', 'A', 'D', 'A', 'D', 'A']
After:  ['A3', 'B3', 'D3', 'C2', 'B2', 'C1', 'A3', 'B1', 'A2', 'C3', 'A2', 'D1', 'A1', 'D2', 'A1']
运行3:

Before: ['A', 'B', 'D', 'C', 'B', 'C', 'A', 'B', 'A', 'C', 'A', 'D', 'A', 'D', 'A']
After:  ['A1', 'B1', 'D3', 'C2', 'B3', 'C3', 'A2', 'B2', 'A3', 'C1', 'A3', 'D1', 'A2', 'D2', 'A1']

下面将生成随机子组,其中给定字符的每个子组大小相同;i、 例如,对于所提供的列表,如果主要组有六个元素
A
,则正好分别有两个元素
A1
A2
A3
。类似地,对于大小为3的其他主要组,最终输出中每个子组中正好有一个元素

from collections import Counter
from random      import randint

element_counter = Counter()

n = 3 # The number of subgroups to produce: the LCM of the size of each group.

groups = ["A", "B", "D", "C", "B", "C", "A", "B", "A", "C", "A", "D", "A", "D", "A"]

# Counts the number of elements in each group.
for element in groups:

    element_counter[element] += 1

subscripts = {key : None for key in element_counter}

# Produces a list of possible subscripts: e.g., [1, 1, 2, 2, 3, 3],
# such that each subgroup of a given group is the same size.
for key in element_counter:

    size = element_counter[key]

    subscripts[key] = [x for x in range(1, n + 1) for y in range(size // n)]

subgroups = []

# Draws and removes a random subscript from the list of subscripts for each
# group member to generate the subgroups.
for element in groups:

    random_number = randint(0, len(subscripts[element]) - 1)

    subgroups.append("{}{}".format(element, subscripts[element].pop(random_number)))

print("Before:\t{}".format(groups))
print("After:\t{}".format(subgroups))

样本输出:

运行1:

Before: ['A', 'B', 'D', 'C', 'B', 'C', 'A', 'B', 'A', 'C', 'A', 'D', 'A', 'D', 'A']
After:  ['A2', 'B3', 'D3', 'C1', 'B2', 'C2', 'A1', 'B1', 'A3', 'C3', 'A2', 'D2', 'A1', 'D1', 'A3']
运行2:

Before: ['A', 'B', 'D', 'C', 'B', 'C', 'A', 'B', 'A', 'C', 'A', 'D', 'A', 'D', 'A']
After:  ['A3', 'B3', 'D3', 'C2', 'B2', 'C1', 'A3', 'B1', 'A2', 'C3', 'A2', 'D1', 'A1', 'D2', 'A1']
运行3:

Before: ['A', 'B', 'D', 'C', 'B', 'C', 'A', 'B', 'A', 'C', 'A', 'D', 'A', 'D', 'A']
After:  ['A1', 'B1', 'D3', 'C2', 'B3', 'C3', 'A2', 'B2', 'A3', 'C1', 'A3', 'D1', 'A2', 'D2', 'A1']

一个简单但更紧凑的解决方案

#! /usr/bin/env/python3
"""
Count the occurence of each symbol.  Each symbols occurs M times, make
a list of the first M integers and store the symbol and the list in a
dictionary.  This is the group.

Randomly permute each group and create a new temporary dictionary that
contains the mod of N for each group element.  Iterate over the
original sequence and concate the two giving the result, popping
element from the temporary dictionary.

"""
from collections import Counter
from random import shuffle

N = 3
seq = ["A", "B", "D", "C", "B", "C", "A", "B", "A", "C", "A", "D", "A", "D", "A"]

symbol = Counter(seq)
group = {key: list(range(count)) for key, count in symbol.items()}

# Do some shuffling
for s in range(10):
    for element_group in group.values():
        shuffle(element_group)
    tmp_shuffle = {k: [e % N + 1 for e in g] for k, g in group.items()}
    grouped_seq = [e + str(tmp_shuffle[e].pop()) for e in seq]

    print(grouped_seq)
运行的示例输出:

['A3', 'B3', 'D2', 'C2', 'B1', 'C1', 'A3', 'B2', 'A2', 'C3', 'A1', 'D3', 'A1', 'D1', 'A2']
['A3', 'B3', 'D3', 'C1', 'B2', 'C2', 'A3', 'B1', 'A2', 'C3', 'A1', 'D2', 'A2', 'D1', 'A1']
['A2', 'B1', 'D2', 'C1', 'B3', 'C3', 'A3', 'B2', 'A1', 'C2', 'A3', 'D3', 'A1', 'D1', 'A2']
['A1', 'B2', 'D1', 'C1', 'B1', 'C2', 'A3', 'B3', 'A2', 'C3', 'A3', 'D2', 'A1', 'D3', 'A2']
['A1', 'B3', 'D2', 'C3', 'B2', 'C2', 'A2', 'B1', 'A3', 'C1', 'A2', 'D1', 'A1', 'D3', 'A3']
['A2', 'B1', 'D1', 'C3', 'B3', 'C2', 'A3', 'B2', 'A1', 'C1', 'A1', 'D3', 'A3', 'D2', 'A2']
['A2', 'B1', 'D1', 'C1', 'B3', 'C3', 'A2', 'B2', 'A3', 'C2', 'A1', 'D3', 'A1', 'D2', 'A3']
['A2', 'B3', 'D2', 'C1', 'B2', 'C3', 'A2', 'B1', 'A3', 'C2', 'A3', 'D3', 'A1', 'D1', 'A1']
['A1', 'B3', 'D3', 'C2', 'B2', 'C1', 'A3', 'B1', 'A2', 'C3', 'A3', 'D1', 'A1', 'D2', 'A2']
['A3', 'B2', 'D1', 'C3', 'B1', 'C1', 'A3', 'B3', 'A2', 'C2', 'A1', 'D2', 'A1', 'D3', 'A2']

一个简单但更紧凑的解决方案

#! /usr/bin/env/python3
"""
Count the occurence of each symbol.  Each symbols occurs M times, make
a list of the first M integers and store the symbol and the list in a
dictionary.  This is the group.

Randomly permute each group and create a new temporary dictionary that
contains the mod of N for each group element.  Iterate over the
original sequence and concate the two giving the result, popping
element from the temporary dictionary.

"""
from collections import Counter
from random import shuffle

N = 3
seq = ["A", "B", "D", "C", "B", "C", "A", "B", "A", "C", "A", "D", "A", "D", "A"]

symbol = Counter(seq)
group = {key: list(range(count)) for key, count in symbol.items()}

# Do some shuffling
for s in range(10):
    for element_group in group.values():
        shuffle(element_group)
    tmp_shuffle = {k: [e % N + 1 for e in g] for k, g in group.items()}
    grouped_seq = [e + str(tmp_shuffle[e].pop()) for e in seq]

    print(grouped_seq)
运行的示例输出:

['A3', 'B3', 'D2', 'C2', 'B1', 'C1', 'A3', 'B2', 'A2', 'C3', 'A1', 'D3', 'A1', 'D1', 'A2']
['A3', 'B3', 'D3', 'C1', 'B2', 'C2', 'A3', 'B1', 'A2', 'C3', 'A1', 'D2', 'A2', 'D1', 'A1']
['A2', 'B1', 'D2', 'C1', 'B3', 'C3', 'A3', 'B2', 'A1', 'C2', 'A3', 'D3', 'A1', 'D1', 'A2']
['A1', 'B2', 'D1', 'C1', 'B1', 'C2', 'A3', 'B3', 'A2', 'C3', 'A3', 'D2', 'A1', 'D3', 'A2']
['A1', 'B3', 'D2', 'C3', 'B2', 'C2', 'A2', 'B1', 'A3', 'C1', 'A2', 'D1', 'A1', 'D3', 'A3']
['A2', 'B1', 'D1', 'C3', 'B3', 'C2', 'A3', 'B2', 'A1', 'C1', 'A1', 'D3', 'A3', 'D2', 'A2']
['A2', 'B1', 'D1', 'C1', 'B3', 'C3', 'A2', 'B2', 'A3', 'C2', 'A1', 'D3', 'A1', 'D2', 'A3']
['A2', 'B3', 'D2', 'C1', 'B2', 'C3', 'A2', 'B1', 'A3', 'C2', 'A3', 'D3', 'A1', 'D1', 'A1']
['A1', 'B3', 'D3', 'C2', 'B2', 'C1', 'A3', 'B1', 'A2', 'C3', 'A3', 'D1', 'A1', 'D2', 'A2']
['A3', 'B2', 'D1', 'C3', 'B1', 'C1', 'A3', 'B3', 'A2', 'C2', 'A1', 'D2', 'A1', 'D3', 'A2']

用随机你是说每次都不一样,还是我不在乎呢?一个“子组”是否可能没有元素(例如,
“A3”
从未出现)。每次都不同。否。以相同字母开头的所有子组的大小必须完全相同。也就是说,如果A1有两个元素,A2也必须有两个元素。但D1可以有一个元素。你好@wwl很高兴,有你在这里,问你的问题。但目前,我想,你的问题或意图可能还不清楚。谢谢。我对我的问题进行了编辑,以纳入@WillemVanOnsem的问题。如果您对其他部分不清楚,请告诉我!用随机你是说每次都不一样,还是我不在乎呢?一个“子组”是否可能没有元素(例如,
“A3”
从未出现)。每次都不同。否。以相同字母开头的所有子组的大小必须完全相同。也就是说,如果A1有两个元素,A2也必须有两个元素。但D1可以有一个元素。你好@wwl很高兴,有你在这里,问你的问题。但目前,我想,你的问题或意图可能还不清楚。谢谢。我对我的问题进行了编辑,以纳入@WillemVanOnsem的问题。如果您对其他部分不清楚,请告诉我!