类型错误:“ generator”对象在python中不可下标

时间:2018-10-17 02:53:22

标签: python

def activity_select(i):
    list(i)
    i.sort(key=lambda x: x[2])
    n = len(i)                        # set n to length of i 
    solution = []
    print("Following activities are selected ")
    j = 0                             # first activity always selected
    solution.append(i[j][0])
    for k in range(n):                # loop through remainder of activities
        if i[k][1] >= i[k][2]:        # if activity has greater start time
            solution.append(i[k][0]) #
            j = k
            return solution

file = open('act.txt')
st = []
sn = 1
for line in file:
    l = line.rstrip()
    if '' not in l and len(st) > 0:
        print("Set", sn)
        solution = activity_select(st)
        print("Number of activities selected = ", len(solution))
        print("Activities: ", *solution)
        sn += 1
        st = []
else:
            st.append((int(i) for i in l.split()))
if len(st) > 0:
    print("Set ", sn)
    sol = activity_select(st)
    print("Number of activities selected = ", len(sol))
    print("Activities: ", *solution)

但是我遇到以下错误

line 27, in <module>
    sol = activity_select(st)
line 9, in activity_select
    sol.append(v[i][0])
TypeError: 'generator' object is not subscriptable 

这与st变量有关吗?或者是别的什么?

3 个答案:

答案 0 :(得分:0)

我在这里看到几个明显的错误:

  1. 您将i参数转换为list,并且没有将其分配回i,因此如果它不是 一个list ,该功能从一开始就被破坏了。使用i = list(i)用列出结果替换i
  2. 您调用st.append((int(i) for i in l.split())),后者正在通过生成器(通过生成器表达式创建)来调用append。如果应该是list,请使用方括号,而不要使用括号:st.append([int(i) for i in l.split()])。如果应该分别添加每个结果,请改用extendst.extend(int(i) for i in l.split())

问题#2几乎可以肯定是当前错误的根源,但是修复问题#1对于使您的代码可用于非列表(并且避免使它list的调用者的副本发生变异)很重要。可以。)

答案 1 :(得分:0)

看到您正在读取一个我们没有的文件,很难调试您的代码。我的猜测是您正在尝试对生成器进行切片,快速浏览一下即可发现您在此处具有生成器表达式:

st.append((int(i) for i in l.split()))

尝试将其更改为st.append([int(i) for i in l.split()])以获得嵌套列表。

答案 2 :(得分:0)

基本上,您的代码存在以下问题:

st.append((int(i) for i in l.split()))

因为要附加具有不可索引,不可切片,不可下标的生成器,所以请使用可索引,可切片,可下标的列表理解。

所以代替:

st.append((int(i) for i in l.split()))

要做:

st.append([int(i) for i in l.split()])