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