0

我有清单A:

['0.0720', '0.0200', '0.0260', '0.0210', '0.0740', '0.0510', '0.0160']

并列出 B:

[
[0.074, 0.073, 0.072, 0.03, 0.029, 0.024, 0.021, 0.02], 
[0.02, 0.015], [0.026, 0.02, 0.015], 
[0.021, 0.02, 0.017], 
[0.077, 0.076, 0.074, 0.055, 0.045, 0.021], 
[0.053, 0.052, 0.051, 0.023, 0.022], 
[0.016]
]

将A的第一个元素与B的第一个子列表进行比较,将A的第一个元素与B的第二个子列表进行比较,将A的第三个元素与的第三个子列表进行比较,最有效的方法是什么B,...,如果它们匹配并且子列表包含 2 个或更多元素,则从 B 中的子列表中删除相应的元素?

4

1 回答 1

1

使用zip()您可以将两个列表中的元素配对:

for a, b in zip(A, B):
    # a is an element from A, b is a sublist from B.

您的子列表包含浮点值,您的列表 A 包含字符串。您需要确定比较的容差。也许将浮点数转换为具有匹配精度的字符串就足够了?

for a, b in zip(A, B):
    # a is an element from A, b is a sublist from B.
    b[:] = [i for i in b if format(i, '.4f') != a]

使用切片赋值 ( b[:]),我们将子列表的内容a替换为小数点后 4 位不匹配的所有元素。

在您的示例输入上运行它会给我:

[
[0.074, 0.073, 0.03, 0.029, 0.024, 0.021, 0.02], 
[0.015], 
[0.02, 0.015], 
[0.02, 0.017], 
[0.077, 0.076, 0.055, 0.045, 0.021], 
[0.053, 0.052, 0.023, 0.022], 
[]
]

如果您只想删除第一个匹配项,请使用:

try:
    del b[next(i for i, e in enumerate(b) if format(e, '.4f') == a)]
except StopIteration:
    pass

这将找到第一个匹配的索引,并将其从b. 结果(在这种情况下与之前完全相同):

[[0.074, 0.073, 0.03, 0.029, 0.024, 0.021, 0.02],
 [0.015],
 [0.02, 0.015],
 [0.02, 0.017],
 [0.077, 0.076, 0.055, 0.045, 0.021],
 [0.053, 0.052, 0.023, 0.022],
 []]
于 2012-12-16T12:40:03.513 回答