简体   繁体   中英

Python: Remove sublist from a nested list following a criterion

I'm trying to remove sublists from a nested list containing all the possible permutation of [1, 1, 1, 0, 0, 0, 0]

[[0, 1, 0, 1, 0, 0, 1], [0, 1, 0, 0, 1, 1, 0], [0, 0, 1, 1, 0, 0, 1], [0, 0, 1, 1, 1, 0, 0], [0, 1, 1, 0, 0, 1, 0], [1, 0, 0, 0, 1, 1, 0], [0, 0, 1, 0, 0, 1, 1], [0, 0, 1, 0, 1, 1, 0], [0, 0, 1, 0, 1, 0, 1], [0, 1, 0, 0, 0, 1, 1], [0, 1, 1, 1, 0, 0, 0], [1, 1, 0, 0, 1, 0, 0], [0, 1, 0, 0, 1, 0, 1], [1, 1, 0, 1, 0, 0, 0], [0, 1, 0, 1, 1, 0, 0], [1, 0, 1, 1, 0, 0, 0], [0, 1, 1, 0, 1, 0, 0], [0, 1, 0, 1, 0, 1, 0], [1, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 0, 1, 1], [1, 0, 1, 0, 1, 0, 0], [1, 1, 0, 0, 0, 1, 0], [1, 0, 0, 0, 0, 1, 1], [1, 0, 1, 0, 0, 1, 0], [0, 0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 1, 0, 1], [0, 0, 0, 1, 1, 1, 0], [1, 0, 0, 0, 1, 0, 1], [1, 1, 1, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0, 1], [1, 0, 0, 1, 0, 1, 0], [1, 0, 0, 1, 0, 0, 1], [1, 1, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 0, 1], [0, 0, 1, 1, 0, 1, 0]]

I want to remove all the sublists in which there are 3 consecutive 0 or two couples of consecutive 0 (eg. i want to remove [1, 0, 1, 0, 0, 0, 1] or [0, 0, 1, 1, 0, 0, 1] ).

Can someone give me an advice on how to proceed? Thanks in advance!

You could define such a methode to find out if a given permutation p has those triple zeros or two double zeros :

def has_triple_zeros(p):
    for i, e in enumerate(p[:-2]):  # e are elements (0s and 1s) of the perm
        if e == 0:  # we encounter a 0
            if p[i+1] == 0 and p[i+2] == 0:  # the two following are also 0s
                return True
    return False  # we made it to the end, no triple 0s

def has_two_double_zeros(p):
    nb_doubles = 0
    i = 0  # init loop
    while i < len(p[:-1]):
        if p[i] == 0:  # we encounter a first 0
            if p[i+1] == 0:  # there is one next to it
                nb_doubles += 1
            i += 1  # skip the next element (already treated, cannot start new double)
        i += 1  # increment the loop
    return nb_doubles == 2


for p in lst:  # here, lst is your list of permutations
    print(p, has_two_double_zeros(p), has_triple_zeros(p))

Then just read your list of permutations and delete if it matches one of your criteria. This is an idea:

res = list()  # result
for p in lst:
    if not (has_two_double_zeros(p) or has_triple_zeros(p)):
        res.append(p)

print(res)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM