Грамматически правильная читаемая человеком строка из списка (с оксфордской запятой) - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу грамматически правильное, удобочитаемое строковое представление списка.Например, список ['A', 2, None, 'B,B', 'C,C,C'] должен возвращать строку A, 2, None, B,B, and C,C,C.Этот надуманный пример несколько необходим.Обратите внимание, что Оксфордская запятая относится к этому вопросу.

Я пытался ', '.join(seq), но это не дает ожидаемого результата для вышеупомянутого примера.

Обратите внимание наранее существовавшие подобные вопросы:

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Вы также можете использовать распаковку для слегка чистящего раствора:

def readable_list(_s):
  if len(_s) < 3:
    return ' and '.join(map(str, _s))
  *a, b = _s
  return f"{', '.join(map(str, a))}, and {b}"

vals = [[], ['A'], ['A', 2], ['A', None, 'C'], ['A', 'B,B', 'C,C,C'], ['A', 'B', 'C', 'D']]
print([readable_list(i) for i in vals])

Выход:

['', 'A', 'A and 2', 'A, None, and C', 'A, B,B, and C,C,C', 'A, B, C, and D']
0 голосов
/ 19 июня 2019

Я стал очень упрямым, и я действительно хотел найти решение с одной линией.

"{} and {}".format(seq[0], seq[1]) if len(seq)==2 else ', '.join([str(x) if (y < len(seq)-1 or len(seq)<=1) else "and {}".format(str(x)) for x, y in zip(seq, range(len(seq)))])

РЕДАКТИРОВАТЬ
Я думаю, что это делает свое дело.И я думаю, что проблема также сложнее, чем я думал, чтобы быть решенным с помощью некрасивой однострочной.

0 голосов
/ 31 декабря 2018

Эта функция работает с маленькими списками иначе, чем с большими.

from typing import Any, List

def readable_list(seq: List[Any]) -> str:
    seq = [str(s) for s in seq]
    if len(seq) < 3:
        return ' and '.join(seq)
    return ', '.join(seq[:-1]) + ', and ' + seq[-1]

Примеры использования:

readable_list([])
''

readable_list(['A'])
'A'

readable_list(['A', 2])
'A and 2'

readable_list(['A', None, 'C'])
'A, None, and C'

readable_list(['A', 'B,B', 'C,C,C'])
'A, B,B, and C,C,C'

readable_list(['A', 'B', 'C', 'D'])
'A, B, C, and D'
...