-1

有人可以帮我解决这个问题吗?我已经做了很多调试和故障排除,但碰壁了。我不会复制整个脚本,而是复制失败的函数:

def deleteOperation(lname1, sKeys, lname2):
    delMaster = copy.deepcopy(lname2)
    for k, v in lname1:
        if k not in sKeys:
            delMaster.remove((k, v))
    return delMaster

以下是参数列表中的值:

lname1 = [(1, 'one'), (3, 'three'), (5, 'five'), (7, 'seven')]
sKeys = [1, 2, 3]
lname2 = [(1, 'one'), (3, 'third'), (5, 'five'), (7, 'seven')]

这个函数应该从列表中删除元素(5,'five')(7,'seven')但是当我执行它时,我得到了错误:

ValueError: list.remove(x): x not in list 

实际上,我通过使用 pyodbc 并连接到 MS SQL 数据库并读取两个表并将这些值包含在 lname1 和 lname2 中获得的所有值。

有趣的是,如果我使用交互式 Python shell 并完全按照我在上面打印的方式手动分配值并运行与我的函数完全相同的命令,它可以正常工作而不会出错。任何线索为什么它发生在我的脚本中?感谢任何输入。

PS 如果我在第 4 行设置断点,我会看到所有正确的值,但它看起来在 list.remove() 内部失败了

4

4 回答 4

0

这是一个更简单的过程:

>>> lname1=[(1,'one'),(3,'three'),(5,'five'),(7,'seven')]
>>> sKeys=[1,2,3]
>>> filter(lambda (x,y) : x in sKeys, lname1)
[(1, 'one'), (3, 'three')]

创建一个新数组,其中仅包含lname1中具有第一个元素的项目sKeys

于 2013-11-06T23:09:18.027 回答
0

问题是它lname1(k, v)对的列表,lname2是 的列表(k, w),并且您正试图(k, v)从 的副本中删除一对lname2。这没有任何意义。

使用您碰巧拥有的值,v并且w对于所有k不在的值都是相同的sKeys,因此您可以摆脱它。但总的来说,这显然不是真的——正如(3, 'third')你的例子所暗示的那样,正如你在评论中明确所说的那样。

因此,如果您尝试从some位于 中但不在 中的所有(k, w)对中删除,那么您做错了;您需要额外搜索才能找到正确的:lname2(k, v)lname1ksKeysw

def deleteOperation(lname1, sKeys, lname2):
    delMaster = copy.deepcopy(lname2)
    for k, v in lname1:
        if k not in sKeys:
            for k2, w in lname2:
                if k2 == k:
                    delMaster.remove((k, w))
    return delMaster

或者,重新组织事情以lname2代替先走。


或者,最简单的是,首先将这些东西转换成字典和集合,这样整个操作就变得微不足道了:

def deleteOperation(lname1, sKeys, lname2):
    for k in lname1:
        if k not in sKeys:
            del lname2[k]
    return lname2

如果您实际上不需要 mutate lname2,而只是想lname2通过 using 从选择的值返回值lname1,则可以使这更简单。那么它就是:

def deleteOperation(lname1, sKeys, lname2):
    d2 = dict(lname2)
    return [(k, d2[k]) for k, v in lname1 if k in sKeys]

再说一次,如果你一开始就使用正确的数据结构会更简单:

def deleteOperation(lname1, sKeys, lname2):
    return {k: lname2[k] for k in sKeys & lname1.keys()}
于 2013-11-06T23:26:52.223 回答
0

帮自己一个忙,只使用列表理解。那么你就不必担心在 Python3filter中不返回 a的事实。list这在 Python2 或 Python3 中同样适用

>>> lname1 = [(1, 'one'), (3, 'three'), (5, 'five'), (7, 'seven')]
>>> sKeys = [1, 2, 3]
>>> [(x, y) for x, y in lname1 if x in sKeys]
[(1, 'one'), (3, 'three')]
于 2013-11-07T00:10:27.360 回答
0

为了更好地诊断您的问题,您可以像这样处理异常

def deleteOperation(lname1, sKeys, lname2):
    delMaster = copy.deepcopy(lname2)
    for k, v in lname1:
        if k not in sKeys:
            try:
                delMaster.remove((k, v))
            except ValueError:
                print("{} not found in {}".format((k,v), delMaster))
    return delMaster

复制列表然后从中删除是一种不寻常的方法。通常,将您想要的项目复制到新的数据结构中会更有效、更安全。你这样做有什么特别的原因吗?

于 2013-11-07T00:18:43.557 回答