【问题标题】:unhashable type: 'list' when creating a combination function with Python不可散列的类型:使用 Python 创建组合函数时的“列表”
【发布时间】:2022-01-05 09:32:01
【问题描述】:

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

【问题讨论】:

    标签: python list types tuples combinations


    【解决方案1】:

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

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

    【讨论】:

    • 哇非常感谢您的回答。我遇到问题是因为 (m,)... 我想这就是为什么即使我更改了第三行 ``` return [()]``` 我仍然会收到错误。
    【解决方案2】:

    集合中的项目应该是可散列的。 List 是可变的,Tuple 是可散列的,所以把 list 改成 tuple。

    将最后一行改为:

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

    【讨论】:

    • 我实际上想更改my_combs() 而不是打印。我应该让我的问题更具体。抱歉...我将问题编辑得更具体。
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2018-12-26
    • 2022-01-11
    • 2015-01-07
    • 2019-05-17
    • 2018-06-07
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多