拆分列表项并删除拆分项,如果两者都不包含在 Python 中的另一个列表中

Split list item and remove split items if both are not contained in another list in Python

我有一个名为 nwk 的列表,每行有两个值。我想使用 split() 来分隔每一行的值,然后将这两个值与另一个整数列表(称为 vals)进行比较。如果 nwk 中连续的两个值都没有包含在 vals 中,我想从 nwk 中删除该行。这是我目前所拥有的:

for line in nwk:
    a = [ (int(n) for n in line.split()) ]
    if a[0] not in vals:
        nwk.remove(line)
    else:
        if a[1] not in vals:
            nwk.remove(line)
        else:
            continue

然而,当我打印 nwk 时,代码只删除了 nwk 中原始行的 1/2,我知道这是不正确的。我该如何解决这个问题?预先感谢您的帮助。

如果你想删除如果 a 中的两个 vals 都在 vals 中的行,那么你可以将列表 a 与列表 vals 进行比较,如 this answer 中所述 如果为真,则删除该行。

像这样:

set(['a', 'b']).issubset(['a', 'b', 'c'])

使用集合是有意义的,因为它会删除列表中的所有重复条目。

这是一个示例代码:

new_list = list()
for line in nwk:
    row_a, row_b = line.split()
    if (row_a not in vals) and (row_b not in vals):
        new_list.append(line)

您可以使用列表理解:

[row for row in nwk if row[0] in vals and row[1] in vals]

这将生成 nwk 的一个子集,其中第 1 列和第 2 列中的每个值都在 val 中。

nwk = [[1, 2], [3, 4], [5, 6], [7, 8]]
vals = [1, 2, 5, 6, 8]

>>> [row for row in nwk if row[0] in vals and row[1] in vals]
[[1, 2], [5, 6]]

filter是你的朋友:

filter(lambda line: any(elem in vals for elem in line.split()), nwk)

不错的读物:

测试:

>>> nwk = ['1 2', '3 4', '5 6', '7 8']
>>> vals = ['1', '2', '5', '6', '8']
>>> list(filter(lambda line: any(elem in vals for elem in line.split()), nwk))
['1 2', '5 6', '7 8']
>>>