不可哈希类型:使用 Python 创建组合函数时'list'



我目前正在尝试创建一个与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)))

最新更新