all non-empty sublists partitionings of a list

5

I had to write a code for finding all non-empty sublists partitionings of a list:

def f(s):
    if s:
        for j in range(1,len(s)+1):
            for p in f(s[j:]):
                yield [s[:j]]+p
    else:
        yield []

I managed to shorten it (for Python 3.4+) to:

def f(s, p=[]):
    if s:
        for j in range(1,len(s)+1):
            yield from f(s[j:],p+[s[:j]])
    else:
        yield p

using yield from and an accumulator argument p (prefix).

Any suggestions on how to shorten it even more?

Example output:

>>> for p in f([1,2,3,4]): print(p)
...
[[1], [2], [3], [4]]
[[1], [2], [3, 4]]
[[1], [2, 3], [4]]
[[1], [2, 3, 4]]
[[1, 2], [3], [4]]
[[1, 2], [3, 4]]
[[1, 2, 3], [4]]
[[1, 2, 3, 4]]
>>>

fferri

Posted 2015-07-13T13:14:50.053

Reputation: 163

3For starters, you can use single char variable names and drop a bunch of whitespace – Sp3000 – 2015-07-13T13:25:58.057

1Can we answer with code in other languages, too? This would work pretty well as a language agnostic challenge. – John Dvorak – 2015-07-13T13:37:05.760

@JanDvorak This is asking for help in golfing the python program. – Okx – 2017-05-18T15:24:47.640

@okx hence my trying to convert this into a regular challenge via my comment. The answer would carry over just fine. – John Dvorak – 2017-05-18T15:28:28.857

Answers

3

66 bytes

p=lambda l:[q+[l[i:]]for i in range(len(l))for q in p(l[:i])]or[l]

If the last part is changed from [l] to [[]], then it can also be used with tuples or strings, in addition to lists.

feersum

Posted 2015-07-13T13:14:50.053

Reputation: 29 566

Try it online – mbomb007 – 2017-05-18T17:01:30.373