TypeError:'set'对象没有属性'__getitem__'

时间:2017-08-20 20:32:14

标签: python python-2.7 python-3.x recursion

我正在尝试使用Python中的递归创建列表列表。

例如:

   li = [1,2,3,4,5] // given list

   listoflists = [[1,2,3,4,5],[2,3,4,5],[3,4,5],[4,5],[5]]//required list


def recur(li,index,perlist):
    if(index==3):
       return
    else:
      templi = li[index:len(li)]
      perlist.append(templi)
      recur(li,index+1,perlist)

li = {1,2,3}
perlist = []
recur(li,0,perlist)
print perlist

它抛出以下错误:

TypeError: 'set' object has no attribute '__getitem__'

1 个答案:

答案 0 :(得分:2)

正如其他用户所指出的那样,列表是用[]括号组成的。

def recur(li,index,perlist):
    if(index==3):
       return
    else:
      templi = li[index:len(li)]
      perlist.append(templi)
      recur(li,index+1,perlist)

li = [1,2,3]
perlist = []
recur(li,0,perlist)
print perlist

工作正常,提供输出

[[1, 2, 3], [2, 3], [3]]

{}括号可能是某种类似C语言的习惯,但在Python中,{}括号中的项列表是一个集合(HashSet)。重要的区别在于集合是无序的,并且用于成员资格测试,而列表是有序的,并且支持索引和迭代。 “has no attribute '__getitem__'”表示集合不支持索引。这与l[0]实际成为l.__getitem__(...)之类的内容有关。请注意,{}括号也用于制作dict s(HashMap,关联数组..),但这是一个冒号 -

更具说明性的术语:

>>> a = {1, 2, 3}
>>> b = [1, 2, 3]
>>> c = {1: "x", 2: "y", 3: "z"}

a是一个集合,

b是一个列表,

c是一个词典