如何根据子列表中的条件删除列表元素

时间:2018-08-03 02:44:57

标签: python list conditional

我有以下列表列表:

list_of_list = [["-", " ", "P"], ["-", " ", "L"], ["-", " ", "R"], ["K", "|", "K"], ["K", "|", "K"], ["I", " ", "-"], ["K", "|", "K"], ["-", " ", "K"], ["-", " ", "V"], ["-", " ", "D"], ["-", " ", "P"], ["-", " ", "K"], ["-", " ", "K"], ["-", " ", "D"], ["-", " ", "Q"], ["-", " ", "E"], ["A", "|", "A"], ["N", " ", "-"], ["-", " ", "K"], ["-", " ", "E"], ["R", "|", "R"], ["-", " ", "L"], ["-", " ", "K"], ["R", "|", "R"], ["S", " ", "-"], ["N", " ", "-"], ["S", " ", "-"], ["K", "|", "K"], ["-", " ", "I"], ["-", " ", "R"], ["K", "|", "K"], ["-", " ", "L"], ["-", " ", "E"]]

看起来像这样:

In [48]: list_of_list
Out[48]:
[['-', ' ', 'P'], # remove this
 ['-', ' ', 'L'], # remove this
 ['-', ' ', 'R'], # remove this
 ['K', '|', 'K'],
 ['K', '|', 'K'],
 ['I', ' ', '-'],
 ['K', '|', 'K'],
 ['-', ' ', 'K'],
 ['-', ' ', 'V'],
 ['-', ' ', 'D'],
 ['-', ' ', 'P'],
 ['-', ' ', 'K'],
 ['-', ' ', 'K'],
 ['-', ' ', 'D'],
 ['-', ' ', 'Q'],
 ['-', ' ', 'E'],
 ['A', '|', 'A'],
 ['N', ' ', '-'],
 ['-', ' ', 'K'],
 ['-', ' ', 'E'],
 ['R', '|', 'R'],
 ['-', ' ', 'L'],
 ['-', ' ', 'K'],
 ['R', '|', 'R'],
 ['S', ' ', '-'],
 ['N', ' ', '-'],
 ['S', ' ', '-'],
 ['K', '|', 'K'],
 ['-', ' ', 'I'],
 ['-', ' ', 'R'],
 ['K', '|', 'K'],
 ['-', ' ', 'L'],  # remove this
 ['-', ' ', 'E']]  # remove this

如上面的输出所示,我要做的是删除列表开头和结尾的元素。首先,我们删除第二个元素为空的所有列表,直到找到|。最后,我们在找到的最后一个|为空之后删除所有列表。

所需的输出是这样:

[['K', '|', 'K'],
 ['K', '|', 'K'],
 ['I', ' ', '-'],
 ['K', '|', 'K'],
 ['-', ' ', 'K'],
 ['-', ' ', 'V'],
 ['-', ' ', 'D'],
 ['-', ' ', 'P'],
 ['-', ' ', 'K'],
 ['-', ' ', 'K'],
 ['-', ' ', 'D'],
 ['-', ' ', 'Q'],
 ['-', ' ', 'E'],
 ['A', '|', 'A'],
 ['N', ' ', '-'],
 ['-', ' ', 'K'],
 ['-', ' ', 'E'],
 ['R', '|', 'R'],
 ['-', ' ', 'L'],
 ['-', ' ', 'K'],
 ['R', '|', 'R'],
 ['S', ' ', '-'],
 ['N', ' ', '-'],
 ['S', ' ', '-'],
 ['K', '|', 'K'],
 ['-', ' ', 'I'],
 ['-', ' ', 'R'],
 ['K', '|', 'K']]

我该如何实现?

4 个答案:

答案 0 :(得分:2)

切片:

s = ''.join(b for a,b,c in list_of_list)
list_of_list[s.find('|'):s.rfind('|')+1]

答案 1 :(得分:1)

切片+ enumerate

l=[i for i,v in enumerate(list_of_list) if v[1]=='|']
l2=list_of_list[l[0]:l[-1]+1]
print(l2)

输出:

[['K', '|', 'K'], ['K', '|', 'K'], ['I', ' ', '-'], ['K', '|', 'K'], ['-', ' ', 'K'], ['-', ' ', 'V'], ['-', ' ', 'D'], ['-', ' ', 'P'], ['-', ' ', 'K'], ['-', ' ', 'K'], ['-', ' ', 'D'], ['-', ' ', 'Q'], ['-', ' ', 'E'], ['A', '|', 'A'], ['N', ' ', '-'], ['-', ' ', 'K'], ['-', ' ', 'E'], ['R', '|', 'R'], ['-', ' ', 'L'], ['-', ' ', 'K'], ['R', '|', 'R'], ['S', ' ', '-'], ['N', ' ', '-'], ['S', ' ', '-'], ['K', '|', 'K'], ['-', ' ', 'I'], ['-', ' ', 'R'], ['K', '|', 'K']]

答案 2 :(得分:0)

您可以使用itertools.groupby

import itertools
def remove_elements(l):
  new_data = [[a, list(b)] for a, b in itertools.groupby(l, key=lambda x:x[1] == ' ')]
  _, *content, _end = new_data
  return [c for _, c in content]

list_of_list = [["-", " ", "P"], ["-", " ", "L"], ["-", " ", "R"], ["K", "|", "K"], ["K", "|", "K"], ["I", " ", "-"], ["K", "|", "K"], ["-", " ", "K"], ["-", " ", "V"], ["-", " ", "D"], ["-", " ", "P"], ["-", " ", "K"], ["-", " ", "K"], ["-", " ", "D"], ["-", " ", "Q"], ["-", " ", "E"], ["A", "|", "A"], ["N", " ", "-"], ["-", " ", "K"], ["-", " ", "E"], ["R", "|", "R"], ["-", " ", "L"], ["-", " ", "K"], ["R", "|", "R"], ["S", " ", "-"], ["N", " ", "-"], ["S", " ", "-"], ["K", "|", "K"], ["-", " ", "I"], ["-", " ", "R"], ["K", "|", "K"], ["-", " ", "L"], ["-", " ", "E"]]
print(remove_elements(list_of_list))

输出:

[[['K', '|', 'K'], ['K', '|', 'K']], [['I', ' ', '-']], [['K', '|', 'K']], [['-', ' ', 'K'], ['-', ' ', 'V'], ['-', ' ', 'D'], ['-', ' ', 'P'], ['-', ' ', 'K'], ['-', ' ', 'K'], ['-', ' ', 'D'], ['-', ' ', 'Q'], ['-', ' ', 'E']], [['A', '|', 'A']], [['N', ' ', '-'], ['-', ' ', 'K'], ['-', ' ', 'E']], [['R', '|', 'R']], [['-', ' ', 'L'], ['-', ' ', 'K']], [['R', '|', 'R']], [['S', ' ', '-'], ['N', ' ', '-'], ['S', ' ', '-']], [['K', '|', 'K']], [['-', ' ', 'I'], ['-', ' ', 'R']], [['K', '|', 'K']]]

或更长一些的解决方案,尽管更可靠:

_start = [i for i in range(len(l)) if all(c[1] == ' ' for c in l[:i])]
_end = [i for i in range(len(l)) if all(c[1] == ' ' for c in l[i:])]
new_l = l[0 if not _start else _start[-1]:len(l) if not _end else _end[-1]-1]

答案 3 :(得分:0)

只玩索引

def ind(l):
    for i,v in enumerate(l):
        if v[1]=="|": return i

ll = ll[ind(ll):]
ll[::-1][ind(ll[::-1]):][::-1]