不可散列类型:'list' 与 Python 创建组合函数时

unhashable type: 'list' when creating a combination function with Python

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

集合中的项目应该是可哈希的。列表是可变的,元组是可散列的,所以将列表更改为元组。

将最后一行更改为:

print(set(tuple(item) for item in my_combinations(test, 2)))

如果您想要元组而不是列表 - 只需使用元组而不是列表:)

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),它只是括号中的东西。