例如,我正在研究一个方法,给定一个特定的大小“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,但我正在尝试解决所有问题(目前),而不依赖于库或包。你知道吗
我宁愿使用itertools函数来实现这一点。这个功能对你有用吗?你知道吗
有关itertools函数的详细信息,请参见:https://docs.python.org/2/library/itertools.html#itertool-functions
我想到的第一个解决方案是将这些数字映射到字典中,其中每个数字都是键(1,2,3,…,9),值是给定数字中每个数字的计数。这样你就不用考虑数字的顺序,而是考虑它们在某个数字中出现的次数。你知道吗
您只需编写一个函数,将整数作为输入,通过将其转换为字符串对其进行迭代,然后将每个数字计数到字典中。你知道吗
您将拥有一个字典,其中所有数字的组合都是键,前面解释的表示形式是值。然后你只需要将映射到同一个字典的不同数字分组,然后根据你想要的标准选择一个。你知道吗
我已经使用了你的代码,并做了一个修改,以达到你的解决方案。我对值进行排序并将其存储在
set
中。 对值进行排序将确保值545, 554 or 455
都被排序到455
。set
不能包含重复的值,这意味着只能添加一次。这不会降低算法的时间复杂度,因为它不会生成较少的值,它不会添加重复的值,并且只存储唯一的值。你知道吗输出:
相关问题 更多 >
编程相关推荐