如果两者都未包含在Python

时间:2015-04-28 22:01:10

标签: python list if-statement for-loop split

我有一个名为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,我知道这是不正确的。我该如何解决这个问题?提前感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

如果要删除该行,如果a中的两个val都在val中,则Ou可以将列表a与列表val进行比较,如this answer中所述 如果为True,则删除该行。

像这样:

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

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

答案 1 :(得分:0)

以下是示例代码:

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)

答案 2 :(得分:0)

您可以使用列表理解:

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

答案 3 :(得分:0)

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