Как str.join, но со случайным разделителем

#python-3.x

Вопрос:

Как бы я присоединился к итерации со случайной (или иным образом выбранной) строкой?

 from itertools import cycle

options = cycle((
    ' and ',
    ' also ',
    ', ',
    ' not to mention '
))

things = ["thing A", "thing B", "thing C", "thing D also", "some other things"]

print(next(options).join(things))
 

Выход: thing A and thing B and thing C and thing D also and some other things
Желаемый результат: thing A and thing B also thing C, thing D not to mention some other things

Что я пробовал:

 from itertools import cycle

options = cycle((
    ' and ',
    ' also ',
    ', ',
    ' not to mention '
))

things = ["thing A", "thing B", "thing C", "thing D also", "some other things"]

result = ''
for i, s in enumerate(things, 1):
    result  = s
    if i % len(s):
        result  = next(options)

print(result)
 

Выход: thing A and thing B also thing C, thing D also not to mention some other things and
Желаемый результат: thing A and thing B also thing C, thing D also not to mention some other things
Это делает больше вещей, которых я не хочу, в зависимости от длины things , а также

Ответ №1:

Вы можете использовать functools.reduce() вместе с random.choice() :

 import functools
import random


options = (" and ", " also ", ", ", " not to mention ")


def random_join(a, b):
    return random.choice(options).join((a, b))


functools.reduce(random_join, things)
 

Выход:

 'thing A, thing B and thing C not to mention thing D also and some other things'
 

Обратите внимание, однако, что у вас есть thing D also , в things чем я не уверен, было намеренно, и иногда это приводит к неловким результатам:

 'thing A and thing B, thing C, thing D also also some other things'