Как отсортировать список по убыванию по количеству заглавных букв в строке элемента - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть список строк, которые выглядят так:

strings = ["abc", "a", "AA", "DAabcas", "adesAA", "EFSFDAAAaaa"]

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

capitals = 0

for i in s:
    if i.isupper():
        capitals += 1
return capitals

"s" - это каждый элемент в строках.

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

Вот результат, который я хочу:

strings = ["EFSFDAAAaaa","DAabcas","adesAA", "AA", "abc", "a"]

Спасибо.

Ответы [ 5 ]

1 голос
/ 10 ноября 2019

list.sort с правильной key функцией:

strings.sort(key=lambda s: (sum(map(str.isupper, s)), len(s)), reverse=True)
# ['EFSFDAAAaaa', 'DAabcas', 'adesAA', 'AA', 'abc', 'a']
1 голос
/ 10 ноября 2019

Ниже приведен еще один способ сделать это.

strings.sort(key=lambda x:(numCapitals(x), len(x)), reverse=True) # a better way 
0 голосов
/ 10 ноября 2019

Ну, этот вопрос выглядит так, как будто вы застряли на вводном курсе по программированию. Итак, у вас уже есть код критерия сортировки (хорошо сделано), давайте распакуем его в функцию:

>>> def capcount(s):
...   capitals = 0
...   for i in s:
...     if i.isupper():
...       capitals+=1
...   return capitals

# but in python this can be translated to:

lambda s: sum(1 for c in s if c.isupper())

Теперь вы можете использовать эту функцию в качестве ключевого параметра встроенного sorted:

strings = ["abc", "a", "AA", "DAabcas", "EFSFDAAAaaa", "adesAA"]
sorted(strings, key = lambda s: sum(1 for c in s if c.isupper()))
==> ["abc", "a", "AA", "DAabcas", "adesAA", "EFSFDAAAaaa"]

Так что это упорядочено в обратном порядке, теперь вы можете сделать одну из двух вещей (возможно, больше):

# Invert what you have now
min_to_max = sorted(strings, key = lambda s: sum(1 for c in s if c.isupper()))
max_to_min = min_to_max[::-1]

# Or change the sorting function around
# lambda s: sum(-1 for c in s if c.isupper())
max_to_min = sorted(strings, key = lambda s: sum(-1 for c in s if c.isupper()))
0 голосов
/ 10 ноября 2019

Относительно Как сортировать, используя несколько критериев , здесь число капитала и длина, которую вы можете сделать

def count_capitals(word): # just a shorter way
    return len([_for _in word if _.isupper()])

if __name__ == '__main__':
    strings = ["abc", "a", "AA", "DAabcas", "adesAA", "EFSFDAAAaaa"]
    result = sorted(strings, key=lambda e: (count_capitals(e), len(e)), reverse=True)


    # Using another computation and inline it
    result = sorted(strings, key=lambda e: (sum(_.isupper() for _ in e), len(e)), reverse=True)

Для сравнения с ответами, данными другими (используя timeit на 1000000 итераций) результат точно такой же (https://pastebin.com/T0m3TDp7):

sum([1 for _ in word if _.isupper()]) 0.1112008
len([1 for _ in word if _.isupper()]) 0.11526590000000003
len([_ for _ in word if _.isupper()]) 0.11423499999999998
len([c for c in word if c.isupper()]) 0.12964770000000003
sum(_.isupper() for _ in word)        0.11216479999999997
sum(map(str.isupper, s))              0.112989
0 голосов
/ 10 ноября 2019

Используя ваш код, в выводе есть неоднозначность. Подстроки: «DAabcas» и «AA» имеют две заглавные буквы. Мы можем использовать второй фактор для разрыва связей, такой как длина строки (len).

def count_capitals(s):
  capitals = 0

  for i in s:
    if i.isupper():
      capitals += 1
  return capitals

strings = ["abc", "a", "AA", "DAabcas", "adesAA", "EFSFDAAAaaa"]

# Use your function as a [sorting key](https://www.geeksforgeeks.org/sorted-function-python/)
s = sorted(strings, key = lambda x: (count_capitals(x), len(x)), reverse=True)
print(s)

Output

['EFSFDAAAaaa', 'DAabcas', 'adesAA', 'AA', 'abc', 'a']
...