Использование 'max' и 'len' для правильного форматирования 10-го элемента списка - PullRequest
0 голосов
/ 22 октября 2018
    for i, items in enumerate(zip(member_names, scores)):
        if i < 10:
            if i == 9:
                msg += "{:<1}. {:<{names_len}} <{:,}>\n".format(i + 1, *items, names_len=len(max(member_names, key=len)) - 1)
                continue
            msg += "{:<1}. {:<{names_len}} <{:,}>\n".format(i + 1, *items, names_len=len(max(member_names, key=len)))

Вот пример выходных данных:

1. xxxx#1598         <12,704>
2. xxxxxxxxxxxx#2390 <7,151>
3. xxxxx#4966        <5,859>
4. xxxx#3562         <3,051>
5. xxxxxxx#6967      <2,831>
6. xxxxx#4643        <2,073>
7. xxxxx#2006        <1,833>
8. xxxx#4720         <1,679>
9. xxxx#8049         <1,651>
10. xxxxxxxxxxxx#8514 <1,614>

member_names - список с несколькими десятками элементов в нем.Мои две проблемы:

  1. Я не могу заставить его правильно учесть тот факт, что десятому элементу в списке понадобится на один пробел меньше.
  2. Будучи таким, какВы можете видеть, что 10-й элемент не расширяет отступ дополнительного символа при использовании names_len.

Может кто-нибудь помочь с этим?Я довольно новичок, и я уже давно в тупике.

Ответы [ 3 ]

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

Я бы попытался немного загромождать все это.Давайте выясним максимальную длину заранее (вместо того, чтобы определять ее один раз за цикл);то же самое с максимальным индексным числом:

num_items = len(str(len(member_names)))
max_length = len(max(member_names, key=len))
for i, items in enumerate(zip(member_names, scores)):
    msg += "{:>{n}}. {:<{m}} <{:,}>\n".format(i + 1, n=num_items, *items, m=max_length)

(я надеюсь, что это работает как есть - не могу проверить это без доступа к вашим данным)

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

Вы можете просто распознать младшие числа, выровняв их по правому краю:

member_names = [f"name_{i}" for i in range(14)]
scores = [3**i for i in range(14)]

maxlen = len(max(member_names, key=len)) # calculate only once
msg = ""
for i, items in enumerate(zip(member_names, scores)):
    msg += "{:>2}. {:<{ml}} <{:,}>\n".format(i + 1, *items,ml=maxlen)

print(msg)

Вывод:

 1. name_0  <1>
 2. name_1  <3>
 3. name_2  <9>
 4. name_3  <27>
 5. name_4  <81>
 6. name_5  <243>
 7. name_6  <729>
 8. name_7  <2,187>
 9. name_8  <6,561>
10. name_9  <19,683>
11. name_10 <59,049>
12. name_11 <177,147>
13. name_12 <531,441>
14. name_13 <1,594,323>

См. Ответ Тима Пицкерса для большей гибкостиподход, который позволил бы> 99 рекордов и при этом выровнять.

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

len() уже возвращает количество элементов в списке.( документация ) max() возвращает наибольшее число.( документация )

Итак, len(max()) возвращает 1, поскольку ищет самое большое число в списке (10), а затем вызывает len (10), что == 1

...