Как напечатать отсортированный список с пустой строкой первым в Python - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть строка, подобная

list = ['stro', 'asdv', '', 'figh']

, и я использую:

for ele in sorted(list):
    print(ele)

, и мне нужно поставить как:

asdv
figh
stro
empty space element from list

Мне нужночтобы наконец получить пустую строку, а остальные строки - в отсортированном порядке

, и если я сделаю обратную сортировку, я бы хотел получить вывод:

 empty string element
 stro
 figh
 asdv

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Вам нужно определить свой собственный ключ для сравнения.Вы хотите, чтобы пустые строки были последними.Мы можем использовать тот факт, что пустая строка имеет вид falsey .

>>> bool('a')
True
>>> bool('')
False

True больше, чем False, поэтому непустые строки будут отсортированы после пустых строк, но мынужно наоборот.

>>> not 'a'
False
>>> not ''
True

В качестве второго критерия сортировки мы возьмем саму строку.Для этого мы должны сравнить кортеж (not s, s), где s - строка.

Мы можем передать это в sorted с параметром key и функцией lambda.

>>> data = ['stro', 'asdv', '', 'figh']
>>> print(sorted(data, key=lambda s: (not s, s)))
['asdv', 'figh', 'stro', '']

Если вы хотите, чтобы это было в обратном порядке, добавьте параметр reverse.

>>> print(sorted(data, key=lambda s: (not s, s), reverse=True))
['', 'stro', 'figh', 'asdv']

Обратите внимание, что я переименовал вашу переменную от list до data.Если вы используете list, вы перезаписываете встроенный list, и это плохая идея, даже в примере.

0 голосов
/ 25 сентября 2019

вы можете сначала распечатать элементы, которые отсортированы не пустыми, а затем вы можете напечатать пустой элемент (ы):

from itertools import chain

for element in chain(sorted(filter(bool, my_list)), filter(lambda x: not x, my_list)):
    print(element)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...