Python 错误列表索引必须是整数,而不是列表。获取一个数组的值将其用作从另一个数组中删除值的索引
以上是我的代码 我想做的是创建一个数组Python 错误列表索引必须是整数,而不是列表。获取一个数组的值将其用作从另一个数组中删除值的索引,python,arrays,list,Python,Arrays,List,以上是我的代码 我想做的是创建一个数组deleteindex,它接受任何带有159的项的索引 它确实得到了我想要的所有值,即所有具有159值的索引,但是当我尝试从具有索引的不同数组中删除这些值时,它会返回错误 列表索引必须是整数,而不是列表 prules是我要获取的数组,索引值包含数字字符串 rulelinescontains是一个字符串列表,我希望使用取自prules的值,并使用这些值作为索引来删除rulelines 我哪里出错了? 我猜一定是什么原因 seen = [] dups = col
deleteindex
,它接受任何带有159
的项的索引
它确实得到了我想要的所有值,即所有具有159
值的索引,但是当我尝试从具有索引的不同数组中删除这些值时,它会返回错误
列表索引必须是整数,而不是列表
prules
是我要获取的数组,索引值包含数字字符串rulelines
contains是一个字符串列表,我希望使用取自prules
的值,并使用这些值作为索引来删除rulelines
我哪里出错了?我猜一定是什么原因
seen = []
dups = collections.defaultdict(list)
for i, item in enumerate(prules)
for j, orig in enumerate(seen):
if item == orig:
dups[j].append(i)
break
else:
seen.append(item)
deleteindex = [val for key,val in dups.iteritems() if seen[key] == '159']
for i in range(o,len(deleteindex)):
n = deleteindex[i]
del rulelines[n]
据我所知,
prules
是一个列表,或者至少是一个可以枚举的集合,在这种情况下,您可以将其转换为一个列表,这是删除重复项所需的全部操作
但是,如果情况并非如此(我无法判断,因为您没有提供这段代码),那么您可以以更好的方式处理整个问题:
deleteindex = [val for key,val in dups.iteritems() if seen[key] == '159']
从你最新的问题来看,我认为你在试图做一些事情,而不是你的问题所涉及的。我认为您正在尝试删除
规则行中的每个索引,其中prules
中的相应索引的值为'159'
,如果是这种情况:
seen = []
duplicate_indexes = []
for index, item in enumerate(prules):
if item in seen:
del rulelines[index]
else:
seen.append(item)
你说得对。
错误是因为,在
for ix, pr in enumerate(prules):
if pr == '159':
del rulelines[ix]
键
是一个列表
。由于dups
是defaultdict(list)
,因此该值将始终是列表
这可以通过以下方式进行验证:
deleteindex = [val for key,val in dups.iteritems() if seen[key] == '159']
至于你的算法,试试这个,一个更容易理解的版本
...
print dict(dups.iteritems()) # adding this
deleteindex = [val for key,val in dups.iteritems() if seen[key] == '159']
...
要获取索引,只需执行以下操作:
import random
prules = [random.randint(150,156) for i in range(30)]
def get_indexes(li):
retval = {}
for i, x in enumerate(li):
if x not in retval:
retval[x] = []
retval[x].append(i)
return retval
dups = get_indexes(prules)
indexes = dups.get('156',[])
rulelines = [rulelines[i] for i in range(len(rulelines[:])) if i not in indexes]
如果dups['156']
存在,它将返回一个索引列表,否则它将返回一个空列表。您的直觉是正确的
dups.get('156',[])
这里,每个val
都是您在上述循环中填充的dups
字典中的一个值。但这些价值观是什么?嗯,dups=collections.defaultdict(list)
表示这些值中的每一个都是列表
因此,由于您没有跟踪您的类型,此代码将中断:
deleteindex = [val for key,val in dups.iteritems() if seen[key] == '159']
你的整个代码在这里都不可见,什么是prules
,什么是规则行
?我很难理解你实际上在做什么——正如我现在删除的答案所证明的,社区不同意:-P。。。您能否提供一个简单的工作示例来演示问题(以及您想要什么的解释),以便我们可以使用它?这可能对获得您的解决方案有很大帮助。如果我想计算列表中某个值的出现次数,我会使用Collections.Counter
内置数据结构:from Collections import Counter has_dups=set(item for item,count in Counter(prules)。items()如果count>1)然后从这里开始。我仍然得到一个列表分配索引超出范围。我已经打印了n和I,看起来n是我想要的值抱歉n
是你想要的,但是规则行的长度是多少?它是否与普鲁士的相同??此外,我们不需要枚举
。它们都是相同长度的。每次调用
del rulelines[n]时,规则行的大小都会减小,这意味着末尾的索引不再有效。它们作为索引太大了,但在开始时就可以了
n = deleteindex[i] # n is a list
del rulelines[n] # you can't index a list with a list