简体   繁体   中英

Find a sublist full of given item and replace it

Assume I have the list following

[1, 1, 1, 1, 2, 1, 3, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1, 1, 3, 1, 1, 2, 2, 1, 2, 1, 1, 3, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 3, 1, 1, 2, 1, 3, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 2, 1, 1, 2, 5, 4, 3, 1, 2, 2, 1, 1, 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 2, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 3, 2, 1, 1, 2, 3, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 4, 2, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 3, 1, 1, 1, 4, 1, 1, 1, 1, 1, 3, 1, 2, 1, 2, 3, 1, 1, 2, 2, 1, 4, 1, 2, 1, 1, 1, 3, 1, 1, 3, 2, 1, 2, 2, 1, 2, 1, 2, 3, 1, 1, 1, 3, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 3, 1, 1, 3, 1, 1, 4, 1, 2, 1, 1, 3, 3, 4, 2, 2, 5, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 4, 3, 1, 1, 1, 3, 1, 1, 1, 2, 1, 3, 4, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 4, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 5, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 4, 2, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 2, 2, 1, 3, 4, 2, 1, 1, 2, 1, 2, 1, 3, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 3, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 5, 1, 1, 1, 2, 1, 1, 1, 2, 1, 4, 1, 3, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2, 4, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 3, 1, 2, 1, 1, 4, 2, 1, 1, 3, 3, 2, 2, 1, 1, 1, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 3, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 4, 1, 3, 2, 2, 1, 1, 3, 1, 2, 2, 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 2, 2, 4, 3, 4, 2, 1, 1, 1, 1, 1, 2, 2, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 4, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 2, 2, 3, 4, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 4, 2, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2]

What I want to do is to compose all the same values following each other to strings. For instance

[1,1,1,1,1,1,1,2,3,1,1,1,2,2,2,2,3,3,4,5,1,1]

should be composed as the following

["1x7",2,3,"1x3","2x4","3x2",4,5,"1x2"]

I reckon multiplying each of the following values and checking if their product is different than 1,4,9,16,25 can work up to some point but when it comes to bigger lists, it won't be enough.

Is there a shortcut that python provides?

You can use itertools.groupby to collect consecutive runs of the same value.

from itertools import groupby
def condense(group):
    values = list(group)
    if len(values) > 1:
        return '{}x{}'.format(values[0], len(values))
    else:
        return values[0]

You can use this function in a list comprehensino

>>> data = [1, 1, 1, 1, 2, 1, 3, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1, 1, 3, 1, 1, 2, 2, 1, 2, 1, 1, 3, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 3, 1, 1, 2, 1, 3, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 2, 1, 1, 2, 5, 4, 3, 1, 2, 2, 1, 1, 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 2, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 3, 2, 1, 1, 2, 3, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 4, 2, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 3, 1, 1, 1, 4, 1, 1, 1, 1, 1, 3, 1, 2, 1, 2, 3, 1, 1, 2, 2, 1, 4, 1, 2, 1, 1, 1, 3, 1, 1, 3, 2, 1, 2, 2, 1, 2, 1, 2, 3, 1, 1, 1, 3, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 3, 1, 1, 3, 1, 1, 4, 1, 2, 1, 1, 3, 3, 4, 2, 2, 5, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 4, 3, 1, 1, 1, 3, 1, 1, 1, 2, 1, 3, 4, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 4, 1, 1, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 5, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 4, 2, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 2, 2, 1, 3, 4, 2, 1, 1, 2, 1, 2, 1, 3, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, 3, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 3, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 5, 1, 1, 1, 2, 1, 1, 1, 2, 1, 4, 1, 3, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2, 4, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 3, 1, 2, 1, 1, 4, 2, 1, 1, 3, 3, 2, 2, 1, 1, 1, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 3, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 4, 1, 3, 2, 2, 1, 1, 3, 1, 2, 2, 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 2, 2, 4, 3, 4, 2, 1, 1, 1, 1, 1, 2, 2, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 4, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 2, 2, 3, 4, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 4, 2, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2]
>>> [condense(g) for k,g in groupby(data)]
['1x4', 2, 1, 3, 2, 1, '2x2', 1, '2x2', '1x4', 3, '1x2', '2x2', 1, 2, '1x2', 3, '1x4', '2x2', 1, 2, 1, 2, 1, 2, '1x2', 3, '1x7', 2, 1, 2, '1x8', 2, '1x4', '2x2', 3, '1x2', 2, 1, 3, 2, '1x2', 2, 1, '2x2', '1x13', 2, '1x3', '2x2', '1x2', '2x2', '1x3', '2x2', '1x4', 2, '1x3', 2, '1x2', 2, 1, 3, 2, '1x6', 2, '1x2', 3, '1x5', 3, '1x2', 3, '1x2', 2, '1x2', 2, 5, 4, 3, 1, '2x2', '1x4', 2, 3, '1x2', '2x6', 1, 2, '1x6', 2, 3, '1x2', 2, 1, 2, '1x2', 2, 3, '1x8', 4, '1x2', 2, 3, '1x2', 3, 2, '1x2', 2, 3, 1, '2x3', 1, '2x2', '1x3', 2, 3, '1x6', 4, 2, '1x3', 2, 1, '2x4', 1, 2, '1x2', '3x2', '1x2', 2, '1x3', '2x2', '1x2', 2, 3, '1x3', 4, '1x5', 3, 1, 2, 1, 2, 3, '1x2', '2x2', 1, 4, 1, 2, '1x3', 3, '1x2', 3, 2, 1, '2x2', 1, 2, 1, 2, 3, '1x3', 3, 2, 1, 2, '1x2', '2x2', '1x10', '2x2', '1x3', '2x2', '1x2', 2, '1x2', 2, '1x3', 3, '1x3', 2, '1x2', 2, '1x2', 2, '1x2', 3, '1x2', 3, '1x2', 4, 1, 2, '1x2', '3x2', 4, '2x2', 5, '1x8', 3, 4, '1x6', 2, 1, 2, '1x2', 4, 3, '1x3', 3, '1x3', 2, 1, 3, 4, '2x3', '1x2', '2x2', '1x6', 2, 3, '1x2', 2, 3, '1x2', '2x2', '1x2', 2, '1x6', 2, '1x2', 4, '1x2', 3, 4, '1x20', '2x2', 1, '2x2', 1, 2, 1, '2x3', 1, '2x2', '1x3', 5, '1x2', 3, '1x7', '2x2', 3, 4, 2, '1x5', 3, '1x4', 3, '2x2', 1, 3, 4, 2, '1x2', 2, 1, 2, 1, 3, 1, 2, '1x5', 2, '1x3', 2, '1x5', 2, '1x3', 3, 2, '1x2', 4, '1x3', 2, '1x8', 2, 1, 3, '1x2', 3, '1x2', '2x2', '1x2', 2, '1x4', 2, '1x2', '2x2', '1x4', 2, 1, 2, '1x2', 2, '1x4', '2x2', 3, 1, 4, '1x2', 2, '1x6', 2, '1x2', 2, 5, '1x3', 2, '1x3', 2, 1, 4, 1, '3x2', '1x3', 3, '1x6', 2, 1, 2, '1x15', 2, '1x4', '2x2', '1x9', 2, '1x8', 2, '1x3', 2, '1x3', 2, 1, '2x2', 1, '2x2', '1x2', '2x2', 3, 1, 2, 1, '2x2', '1x4', 2, 4, '1x4', '2x2', '1x3', 2, '1x2', 2, '1x10', 2, '1x4', 2, 1, 3, 2, '1x11', 2, '1x5', 2, '1x2', '2x2', '1x3', 2, '1x2', 2, 1, 3, 1, 2, '1x2', 4, 2, '1x2', '3x2', '2x2', '1x3', 4, 3, 2, '1x10', 2, '1x3', '2x2', '1x2', '2x2', '1x6', '2x2', '1x2', 2, '1x2', 2, '1x2', 3, '1x3', 2, '1x3', '2x2', '1x2', 2, '1x2', 2, '1x2', 2, '1x2', 3, '1x2', 2, '1x2', '2x2', '1x4', '2x2', '1x3', 4, 1, 3, '2x2', '1x2', 3, 1, '2x2', 1, '2x2', 3, '1x16', '2x2', '1x7', 3, '1x5', 2, '1x5', 2, '1x5', '2x2', '1x4', 2, '1x2', 2, '1x2', 3, '1x3', 3, '1x4', '2x2', 4, 3, 4, 2, '1x5', '2x3', 3, '1x4', 2, '1x5', 2, '1x4', 2, '1x2', 2, 1, 2, 4, '1x4', '2x2', '1x2', 2, '1x4', 3, '1x3', 3, '1x4', 2, 1, '2x2', 3, 4, '1x2', '2x2', '1x8', 3, 2, '1x2', 3, '1x33', 2, '1x2', 2, '1x3', 2, 3, '1x5', 2, '1x6', 2, '1x5', 2, '1x2', 2, 1, '2x2', '1x5', 2, '1x2', 2, '1x8', 2, '1x3', '2x2', '1x2', 2, '1x9', 3, 2, '1x5', 2, '1x7', 3, '2x2', '1x5', 2, '1x3', 2, '1x10', 3, 1, 2, '1x3', '2x2', '1x2', 2, '1x2', 2, 4, 2, 1, 3, '1x2', 2, '1x6', 2]

If you just want this data to take less space, you can use a dictionary with the items as keys and number of their appearance in the list as values. I used set to remove duplicates and then created the dictionary.

a = [1,1,1,1,1,1,1,2,3,1,1,1,2,2,2,2,3,3,4,5,1,1]
d = {i:a.count(i) for i in set(a)}
print(d)

output:

{1: 12, 2: 5, 3: 3, 4: 1, 5: 1}

Reading from and writing to a dictionary is a lot easier than a string in that form. You can also simply store a dictionary as JSON file.

UPDATE :

So if the sequence of the elements is important. You can do like this:

a = [1,1,1,1,1,1,1,2,3,1,1,1,2,2,2,2,3,3,4,5,1,1]
b = []
count = 1
for i in range(1,len(a)):
    if a[i-1] != a[i]:
        b.append((a[i-1],count))
        count = 0
    count += 1
b.append((a[-1],count))
print(b)

output:

[(1, 7), (2, 1), (3, 1), (1, 3), (2, 4), (3, 2), (4, 1), (5, 1), (1, 2)]

It will loop through the list and creates a tuple with the item as its first element and its counts as second element.

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