我目前正在尝试创建一个与itertools.combinations
具有相同函数的组合函数。
以下代码是我正在处理的代码:
def my_combs(s, num):
if num == 0:
return [[]]
res = []
for i in range(0, len(s)):
m = s[i]
rems = s[i + 1:]
for p in my_combs(rems, num-1):
res.append([m]+p)
return res
from itertools import combinations
test = [1, 2, 3, 4]
print(set(combinations(test, 2)))
print(set(my_combs(test, 2)))
我想要得到的结果是
{(1, 2), (1, 3), (1, 4), (2, 3), (3, 4), (2, 4)}
但我一直收到一个错误,上面写着unhashable type: 'list'
然后,当我将print(set(my_combs(test, 2)))
更改为print(my_combs(test, 2))
时,我得到
[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
虽然结果的元素似乎是相同的,
我想以元组(即{((}(而不是列表(即[[]](来获得结果
有什么方法可以解决错误,并在不变任何打印语句的条件下获得我想要的结果吗?
(即,我希望打印语句为print(set(my_combs(test, 2)))
,并仅更改my_combs()
功能(
如果你想要元组而不是列表-只需使用元组而不是名单:(
def my_combinations(s, num):
if num == 0:
return [()] # HERE
res = []
for i in range(0, len(s)):
m = s[i]
rems = s[i + 1:]
for p in my_combinations(rems, num-1):
res.append((m,)+p) # HERE
return res
from itertools import combinations
test = [1, 2, 3, 4]
print(set(combinations(test, 2)))
print(set(my_combinations(test, 2)))
注意,一个元素元组中必须有一个逗号:(m,)
;没有它,(m)
,它只是括号里的东西。
集合中的项应该是可散列的。列表是可变的,元组是可散列的,所以将列表更改为元组。
将最后一行更改为:
print(set(tuple(item) for item in my_combinations(test, 2)))