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并手动分配与上面打印完全相同的值并运行与我的函数完全相同的命令,那么它可以正常工作。 任何线索为什么它发生在我的脚本? 感谢任何意见。
P.S。如果我在第4行放置一个断点,我会看到所有正确的值,但它看起来在list.remove()内部失败
答案 0 :(得分: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
的{{1}}中包含第一个元素的项目。
答案 1 :(得分:0)
问题是lname1
是(k, v)
对的列表,lname2
是(k, w)
的列表,而您正在尝试删除(k, v)
}来自lname2
的副本。这没有任何意义。
根据您碰巧拥有的值,v
和w
对于k
以外的所有sKeys
值都是相同的,所以您可以逃脱它。但是这显然不是正确的 - 正如你的例子中的(3, 'third')
暗示的那样,并且正如你在评论中明确指出的那样。
因此,如果您尝试从(k, w)
移除所有lname2
对,其中(k, v)
位于lname1
,但k
不在sKeys
{1}},你做错了;您需要额外搜索才能找到合适的w
:
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
。
或者,最简单的说,就是把这些东西转换成dicts并设置在第一位,这样整个操作就变得微不足道了:
def deleteOperation(lname1, sKeys, lname2):
for k in lname1:
if k not in sKeys:
del lname2[k]
return lname2
如果您实际上不需要改变lname2
,但只想返回使用lname2
选择的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()}
答案 2 :(得分:0)
帮自己一个忙,只需使用列表理解。那么你不必担心filter
在Python3中没有返回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')]
答案 3 :(得分: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
复制列表然后从中删除是一种不寻常的方法。通常,将 想要的项目复制到新的数据结构中会更有效,更安全。您是否有这样做的特殊原因?