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