如何从列表中删除两次包含相同数字的组合,其中重复包含相同的数字?

Posted

技术标签:

【中文标题】如何从列表中删除两次包含相同数字的组合,其中重复包含相同的数字?【英文标题】:How to remove combinations that contains same number twice from the list, which contains that same number repetitively? 【发布时间】:2020-01-16 05:00:14 【问题描述】:

我想为从 1 到 k 的最多 k 个子序列的组合键入代码。在这里,我试图找到两次不包含相同数字的子序列,即使列表包含。

我正在尝试这样做,但我在第一部分失败了。

import itertools

lst1=[1, 2, 3, 5, 6, 3, 9, 5, 1, 2]
k = int(input())
lst = [i for j in range(1,k+1) for i in itertools.combinations(lst1, j)]
set1 = set(lst)
print(lst)
print(set1)

代码应该给出如下答案: [(1,2,3), (1,3,5),...] 但它不应该给出 (1,2,1) 或 (1,2,2),因为它包含重复的数字。

【问题讨论】:

欢迎来到 SO!你能更精确地了解你想要的输出吗?我有点困惑,因为您的输出不是以空列表开头,后跟(1,) 等元组。但是,本能地,为什么不使用set(lst1) 并将其传递给combinations?感谢您的澄清。 是的,我很抱歉。我的列表确实从元组中的 1 个元素开始,而不是 2 个元素,但是当它出现 2 个元素时,我不希望像 (1, 1) 等相同的元素出现......如果它适用三个元素我不希望任何形式的重复元素,如 (1,2,1) 或 (1,1,2),它不应该出现在列表中。谢谢@ggorlen 我使用集合升级了我的代码,但它仍然在列表中给出重复元素,如 (1,2,2)。 @ggorlen 您可以逐字发布所需的输出吗?我仍然在猜测精确的输出应该是什么。谢谢。 如果我的列表是 [1, 1, 2, 2, 3],我的输出应该包含... (1,2); (1,2); (1,3); (1,2); (1,2); (1,3); (2,3); (2,3); (1,2,3); (1,2,3); (1,2,3); (1,2,3) ------ 这里我的输出忽略了所有的 (1,1); (2,2);或 (2,2,3).... 它没有必要它应该是元组,它也可以是列表形式。 @ggorlen 【参考方案1】:

根据您的逻辑,我编写了此代码以从列表中删除重复列表。

import itertools

lst1=[1, 2, 3, 5, 6, 3, 9, 5, 1, 2]
k = int(input())
lst = [i for j in range(1,k+1) for i in itertools.combinations(lst1, j)]
set1 = set(lst)
print(lst)
print(set1)
all_combination = list(set1)
new = []
status = False
for i in all_combination:
    for j in range(len(i)):
        l = j+1
        for k in range(l, len(i)):
            if i[j] == i[k] and i[j] not in new:
                status = True
                break
            else:
                status = False
        if status == True:
            break
    if status == False:
        new.append(i)
print(new)

但是您的示例答案显示了给定数量的长度为 3 或 n 的子集的组合。并从中删除重复项。这是我的代码,它将返回列表中存在的所有长度为 3 或 n 的数字组合并删除重复项,只需更改 s 的值,您就会得到相应的组合。

l1 = [1, 2, 3, 5, 6, 3, 9, 5, 1, 2]
s = 3
new_list = []
all_combination = []
def combination(numbers, n, subset):
    if len(subset) == n:
        all_combination.append(subset)
    else:
        for i in range(len(numbers)):
            combination(numbers, n, subset + [numbers[i]])
combination(l1, s, new_list)
print(all_combination)
unique = []
status = False
for i in all_combination:
    for j in range(len(i)):
        l = j+1
        for k in range(l, len(i)):
            if i[j] == i[k] and i[j]:
                status = True
                break
            else:
                status = False
        if status == True:
            break

    if status == False:
        unique.append(i)
print(unique)

【讨论】:

以上是关于如何从列表中删除两次包含相同数字的组合,其中重复包含相同的数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不删除先前相同值的情况下选择具有重复项的列表中的特定数字?

从包含特定字符的列表中删除元素[重复]

Python 3,如果列表中包含特定的东西,如何删除部分元素3 [重复]

Python中可变数据的重复数据删除/合并

快速的独特组合(来自有重复的列表),无需查找

表中数组的组合[重复]