0
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]

以上是我的代码。

我想要做的是创建一个数组deleteindex,它接收任何带有159in 的项目的索引。

它确实获得了我想要的所有值,即所有具有该值的索引,159但是当我尝试从具有索引的不同数组中删除值时,它返回错误

列表索引必须是整数,而不是列表。

prules是我想要获取索引值的数组包含数字字符串
rulelines包含是一个字符串列表,我想使用从中获取的值prules并使用这些值作为索引来删除这些值rulelines

我哪里出错了?
我猜它的东西在

deleteindex = [val for key,val in dups.iteritems() if seen[key] == '159']
4

3 回答 3

1

你说的对。
错误是因为,在

deleteindex = [val for key,val in dups.iteritems() if seen[key] == '159']

key是一个list。照dups原样defaultdict(list),该值将始终为 a list
这可以通过以下方式验证:

...
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.get('156',[])

如果dups['156']存在,它将返回一个索引列表,否则返回一个空列表。

于 2013-04-04T14:01:48.813 回答
0

你的直觉是对的。

deleteindex = [val for key,val in dups.iteritems() if seen[key] == '159']

这里每个都是您在上述循环中填充val的字典中的值之一。dups但是这些值是什么?那么,dups = collections.defaultdict(list)将表明这些值中的每一个都是一个list.

因此,由于您没有跟踪您的类型,此代码会中断:

n = deleteindex[i]  # n is a list
del rulelines[n]    # you can't index a list with a list
于 2013-04-04T14:02:15.117 回答
-1

据我所知,prules是一个列表,或者至少是一个可以枚举的集合,在这种情况下,您可以将其转换set为您需要做的所有事情来删除重复项。


但是,如果不是这种情况(我无法确定,因为您没有提供那段代码),那么您可以以更好的方式处理整个事情:

seen = []
duplicate_indexes = []
for index, item in enumerate(prules):
    if item in seen:
        del rulelines[index]
    else:
        seen.append(item)

从您更新的问题中,我认为您正在尝试做一些其他事情,而不是您的问题。我认为您正在尝试删除每个索引,如果是这种情况,则rulelines其中相应索引prules的值为:'159'

for ix, pr in enumerate(prules):
    if pr == '159':
        del rulelines[ix]
于 2013-04-04T13:22:07.633 回答