【问题标题】:TypeError: list indices must be integers, not set PythonTypeError:列表索引必须是整数,而不是设置 Python
【发布时间】:2017-05-06 03:10:39
【问题描述】:

我在这里尝试做的是将集合列表作为输入并返回出现在所有给定集合中的一组元素。我收到'TypeError: list indices must be integers, not set' 错误。我不明白为什么会这样,因为range(len(list_of_sets)) 是一个整数列表。

def intersection_of_sets(list_of_sets):
    return reduce(lambda x, y: list_of_sets[x] &\
    list_of_sets[y], range(len(list_of_sets)))

print(intersection_of_sets([{1, 2, 3}, {2, 3, 4}, {2, 5}, {1, 2, 5}]))

我要的这个输出是set([2])

【问题讨论】:

标签: python-2.7 lambda set reduce


【解决方案1】:

问题出现在reduce() 操作的第二次迭代/步骤上,因为第一次迭代/步骤产生了一个集合:

list_of_sets[0] & list_of_sets[1]  # returns a set 

调试一下就可以观察到,打印出xy的值:

def intersection_of_sets(list_of_sets):
    def merge_function(x, y):
        print(x, y)
        return list_of_sets[x] & list_of_sets[y]

    return reduce(merge_function, range(len(list_of_sets)))

你会看到打印出来的:

0 1
{2, 3} 2  # < we've got a problem here
...
TypeError: list indices must be integers or slices, not set

你的意思是减少list_of_sets本身:

def intersection_of_sets(list_of_sets):
    return reduce(lambda x, y: x & y, list_of_sets)

演示:

In [1]: from functools import reduce

In [2]: def intersection_of_sets(list_of_sets):
   ...:     return reduce(lambda x, y: x & y, list_of_sets)
   ...: 

In [3]: print(intersection_of_sets([{1, 2, 3}, {2, 3, 4}, {2, 5}, {1, 2, 5}]))
set([2])

【讨论】:

    【解决方案2】:

    因为您正在访问整个集合,例如{1,2,3}。 试试吧:

    set([2][1])
    

    【讨论】:

      【解决方案3】:

      遍历所有这些都有效:

      def intersection_of_sets(list_of_sets):
          res = list_of_sets[0]
          for s in list_of_sets[1:]:
              res &= s
          return res
      
      print(intersection_of_sets([{1, 2, 3}, {2, 3, 4}, {2, 5}, {1, 2, 5}]))
      

      输出:

      {2}
      

      这里&amp;=是就地操作符,意思和res = res &amp; s一样。

      【讨论】:

        【解决方案4】:

        集合有一个内置函数,intersection

        a = {1, 2, 3}
        b = {1, 2, 4}
        c = {0, 2, 5}
        a.intersection(b).intersection(c)
        

        返回:{2}

        只需创建一个递归函数来比较前两个并推送结果,直到数组或结果集的长度都只有一个。

        def compareSets(arr):
            if len(arr) == 1: return arr[0]
            intersect = arr[0].intersection(arr[1])
            if len(arr) == 0: return {}
            arr.append(intersect)
            return compareSets(arr)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-09
          • 1970-01-01
          • 2018-01-03
          • 1970-01-01
          • 2014-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多