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]]
>>>
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