从一组2元组生成3元组

2024-06-06 18:07:30 发布

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

在前面的问题中:

Generating maximum number of 3-tuples from a list of 2-tuples

我从@AChampion得到了一个答案,如果2元组的数目可以被3整除,这个答案似乎是有效的。但是,如果我们有10个2元组,解决方案就失败了。经过一段时间的摸索,我的印象是不可能找到一个完美的解决方案,例如:

(1,2)(1,3),(1,4),(2,3),(2,4),(3,4)

所以我想找到一个解决方案,使剩余元组的数量最小化。在上面的例子中,结果可能是:

(1,2,3)           # derived from (1,2), (1,3), (2,3)
(1,4),(2,4),(3,4) # remainder tuples 

从3个2元组生成3元组的规则是:

(a,b), (b,c), (c,a) -> (a, b, c)

也就是说,2元组是一个长度为3的循环。三元组中元素的顺序并不重要,即:

(a,b,c) == (c,a,b)

我对有个数字n的情况很感兴趣:

for x in range(1,n+1):
    for y in range(1,n+1):
        if x!=y:
            a.append((x,y))

# a = [ (1,2),...,(1,n), (2,1),(2,3),...,(2,n),...(n,1),...,(n,n-1) ]

从a开始,最小化生成3元组时剩余的2元组数。每个2元组只能使用一次。你知道吗

我绞尽脑汁想了好几个小时,但似乎找不出一个优雅的解决办法(嗯,我也没有找到一个丑陋的解决办法)一:-)一般情况下。有什么想法吗?你知道吗


Tags: of答案infromnumberfor情况range
1条回答
网友
1楼 · 发布于 2024-06-06 18:07:30

为此,您需要创建用于替换的组合数。然后循环3个包含上述任意组合的项目的数据并替换它们。 我已经分几步做了这件事。你知道吗

from itertools import combinations

# create replacements elements
number_combinations_raw = list(combinations(range(1, 5), 3))

# create proper number combinations
number_combinations = []
for item in number_combinations_raw:
    if (item[0] + 1 == item[1]) and (item[1] + 1 == item[2]):
        number_combinations.append(item)

# create test data
data = [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4)]

# reduce data
reduce_data = []
for number_set in number_combinations:
    count = 0
    merged_data = []
    for item in data:
        if (number_set[0] in item and number_set[1] in item) or (number_set[1] in item and number_set[2] in item) \
            or (number_set[0] in item and number_set[2] in item):
            merged_data.append(item)
            count += 1
    if count == 3:
        reduce_data.append((number_set, merged_data))

# delete merged elements from data list and add replacement
for item in data:
    for reduce_item in reduce_data:
        for element in reduce_item[1]:
            if element in data:
                data.remove(element)

        data = [reduce_item[0]] + data

# remove duplicated replaced elements
final_list = list(dict.fromkeys(data))

输出:

[(1, 2, 3), (1, 4), (2, 4)]

相关问题 更多 >