@pypyshka

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

Добрый день.

Есть список, например, a = [текст/1/текст, текст/3/текст, текст/2/текст] (текст с наибольшим числом может быть в любой позиции списка). Как можно, в данном случае, найти и вывести строку с наибольшим числом, то есть "текст/3/текст"?
  • Вопрос задан
  • 398 просмотров
Решения вопроса 2
@3dr1aN
import re

a = ['текст/1/текст', 'текст/3/текст', 'текст/2/текст']
maxi = 0
s = ''
for i in a:
    u = int(re.findall(r'\d', i)[0])
    if maxi < u:
        maxi = u
        s = i
print(s)
Ответ написан
aRegius
@aRegius
Python Enthusiast
>>> a = ['maz/2/arini', 'ya/16/streb', 'lovel/5/as']
>>> b = [i.split('/') for i in a]
>>> b_sort = sorted(b, key=lambda x: int(x[1]))
>>> b_sort_max = b_sort[-1]
>>> text_max = '/'.join(b_sort_max)
>>> text_max
'ya/16/streb'
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
JRazor
@JRazor
Senior StarkOverFlow Programmer
Вот ключ для поиска: lambda x: int(re.search(r'\d+', x).group(0))

import re

a = ['maz/2/arini', 'ya/16/streb', 'lovel/5/as']
key = lambda x: int(re.search(r'\d+', x).group(0))

print min(a, key=key)  # Минимальное число
print max(a,  key=key)  # Максимальное число
print sorted(a,  key=key)  # Сортировка
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Ух как все любят регулярки. Вот только они меееедленные. Вариант примерно в 20 раз быстрее:
a = ['maz/2/arini', 'ya/16/streb', 'lovel/5/as']
max([int(''.join([c for c in i if c.isdigit()])) for i in a])

Но можно ещё ускориться! Вариат ещё в 3 раза быстрее предыдущего:
import string
translation = str.maketrans(string.digits, string.digits, string.ascii_letters + string.punctuation)
max([int(i.translate(translation)) for i in a])

Он для Python 3, но с небольшими правками работает и на 2-м.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы