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
变量有关吗?或者是别的什么?
答案 0 :(得分:0)
我在这里看到几个明显的错误:
i
参数转换为list
,并且没有将其分配回i
,因此如果它不是 一个list
,该功能从一开始就被破坏了。使用i = list(i)
用列出结果替换i
st.append((int(i) for i in l.split()))
,后者正在通过生成器(通过生成器表达式创建)来调用append
。如果应该是list
,请使用方括号,而不要使用括号:st.append([int(i) for i in l.split()])
。如果应该分别添加每个结果,请改用extend
:st.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()])