Выведите выровненный по правому краю столбец таблицы, включающий английский и японский текст в Python3 - PullRequest
0 голосов
/ 05 октября 2018

У меня есть столбец, состоящий из английских и японских символов, и мне нужно напечатать столбец в правильном порядке.

Это столбец, который я должен напечатать:

column = ["通常残業時間", "bbbbbbbbb", "tttt"]

Обычным способом было бы получить максимальную длину строки и соответственно скорректировать, но проблема в том, что текст также на японском, а ширина японского символа больше, чем английского.Как мне сравнить длины строк в этом случае и напечатать соответственно?

Это обязательный вывод:

通常残業時間
 bbbbbbbbb
      tttt

Я работаю в Python3.

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Кажется, что кандзи (и китайские) буквы в два раза длиннее ascii.

Итак, я буду использовать .encode('ascii') и UnicodeEncodeError, чтобы проверить, является ли строка ascii или нет.(Исходя из ответа здесь: https://stackoverflow.com/a/196391/837627)

Если это ascii, нам потребуется больше пробелов перед строкой.

Вот решение:

words = ["hhhh", "你你你你你你"]
max_length = 0

# Find the max length string in the array
# For kanji strings, the max length is doubled
for line in words:
    line_length = 0
    try:
        line.encode('ascii')
    except UnicodeEncodeError:
        line_length = 2 * len(line)
    else:
        line_length = len(line)
    if max_length < line_length:
        max_length = line_length

# Find the number of spaces to add by subtracting max line length by length of current line
# If current line is kanji, it is twice a ascii string length
for line in words:
    space = 0
    try:
        line.encode('ascii')
    except UnicodeEncodeError:
        space = max_length - (len(line)*2)
    else:
        space = max_length - len(line)
    print((' ')*space + line)

Вывод:

        hhhh
你你你你你你

Первая строка длиной 4 символа ascii. Вторая строка длиной 6 китайских символов == 12 символов ascii длиной. Таким образом, 12-4=8 пробелы перед первой строкой (MONOSPACE!!!). В StackOverflow он выглядит некорректно, но в терминале он будет выровнен из-за моноширинного шрифта.

Кстати, я использовал Python3 для написания этого решения.

0 голосов
/ 06 октября 2018

Вы можете использовать r.just на двух последних элементах column

column = ["通常残業時間", "bbbbbbbbb", "tttt"]

for idx, item in enumerate(column):
    if not idx:
        print(item)
    else:
        print(item.rjust(12))
通常残業時間
 bbbbbbbbb
      tttt
0 голосов
/ 05 октября 2018

Проблема в том, что ширина японского символа немного шире английского символа, а также пробела. ' '

В этой ситуации есть решения.Вам просто нужно вычислить ширину этих двух видов языка.

columns = ["通常残業時間", "bbbbbbbbb", "tttt"]
for i in column:
    print('|'.join(list(i)))

Вы можете получить такие вещи.

通|常|残|業|時|間
b|b|b|b|b|b|b|b|b
t|t|t|t

Вы можете использовать |, чтобы найтиотношение ширины.Здесь я думаю, что это почти похоже на то, что 5 японских равно 9 английским символам (не забывайте минус |.)

Когда вы получаете соотношение ширины.

Тогда я думаюВы можете знать, как рассчитать длину, которую они должны соответствовать.


Извините за неправильный или вводящий в заблуждение совет.Я понял, что вы не можете выровнять его, если не найдете другую ширину пространства, подходящую для разных языковых символов.

Но я думаю, что мог бы найти некоторый относительный вопрос об этом и некотором полезном пакете.

Отображение ширины строк Unicode в Python [дубликаты]

kitchen.text.display.textual_width Это просто для python2.7, к сожалению ...

...