如何删除列表中顺序不同的相同元素?

2024-04-20 13:00:23 发布

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

例如,我正在研究一个方法,给定一个特定的大小“k”,一个整数“n”,我可以从“{1…n}生成长度为“k”的子集。你知道吗

这是我目前的代码:

def combinations(k,lista,comb):
    if(len(comb)==k):
        print(comb)
    else:
        for i in range(len(lista)):
            combinations(k,lista,comb + str(lista[i]))
def starter(n,k):
    lista = []
    for i in range(1,n+1):
        lista.append(i)
    combinations(k,lista,"")

starter(5,3)

starter(5,3)的输出是:

111
112
113
114
115
121
122
123
124
125
131
132
133
134
135
.
.
.
545
551
552
553
554
555

我的问题是它是重复的,正如您所看到的,我在输出中有545和554(以及455;未显示),而在这种情况下,排序应该无关紧要,因此我应该保留545、554或455。我在输出中也有332以及323和233,这三个被认为是“重复的”,我只需要保留一个。你知道吗

如何修改我的代码来过滤这个?你知道吗

编辑:在我的代码“k”是“m”,我修正了它,以避免误解。你知道吗

Edit2:我知道我可以使用itertools,但我正在尝试解决所有问题(目前),而不依赖于库或包。你知道吗


Tags: 方法代码inforlenifdefrange
3条回答

我宁愿使用itertools函数来实现这一点。这个功能对你有用吗?你知道吗

from itertools import combinations
list(combinations([1,2,3,4,5,6,7,8,9,0], 3))   

有关itertools函数的详细信息,请参见:https://docs.python.org/2/library/itertools.html#itertool-functions

我想到的第一个解决方案是将这些数字映射到字典中,其中每个数字都是键(1,2,3,…,9),值是给定数字中每个数字的计数。这样你就不用考虑数字的顺序,而是考虑它们在某个数字中出现的次数。你知道吗

您只需编写一个函数,将整数作为输入,通过将其转换为字符串对其进行迭代,然后将每个数字计数到字典中。你知道吗

>>> n = 1233657
>>> digits = [int(d) for d in str(n)]           
>>> digits
[1, 2, 3, 3, 6, 5, 7]
>>> digit_count = dict.fromkeys(digits, 0)
for d in digits:
... digit_count[d] += 1
... 
>>> digit_count
{1: 1, 2: 1, 3: 2, 5: 1, 6: 1, 7: 1}

您将拥有一个字典,其中所有数字的组合都是键,前面解释的表示形式是值。然后你只需要将映射到同一个字典的不同数字分组,然后根据你想要的标准选择一个。你知道吗

我已经使用了你的代码,并做了一个修改,以达到你的解决方案。我对值进行排序并将其存储在set中。 对值进行排序将确保值545, 554 or 455都被排序到455set不能包含重复的值,这意味着只能添加一次。这不会降低算法的时间复杂度,因为它不会生成较少的值,它不会添加重复的值,并且只存储唯一的值。你知道吗

values = set()


def combinations(k, lista, comb):
    if(len(comb) == k):
        # print(comb)
        value = ''.join(sorted(comb))
        values.add(value)
    else:
        for i in range(len(lista)):
            combinations(k, lista, comb + str(lista[i]))


def starter(n, k):
    lista = []
    for i in range(1, n + 1):
        lista.append(i)
    combinations(k, lista, "")


starter(5, 3)
print(values)

输出:

{'122', '245', '145', '355', '111', '235', '223', '233', '113', '224', '144', '333', '134', '112', '445', '125', '255', '225', '155', '234', '345', '123', '444', '455', '222', '115', '344', '133', '114', '335', '124', '334', '135', '244', '555'}

相关问题 更多 >