вариант 1 (решение в лоб):
text = "XABXCABBBCAADBXXBAADX"
max_size = 0
size = 0
for letter in text:
if letter in 'ABC':
size += 1
else:
if max_size < size:
max_size = size
size = 0
if max_size < size:
max_size = size
print(max_size)
вариант 2 (укороченный):
size, max_size = 0, 0
for letter in text:
size, max_size = (size + 1, max_size) if letter in 'ABC' else (0, size if max_size < size else max_size)
max_size = size if max_size < size else max_size
вариант 3 (однострочный):
правда тут небольшой изврат и работает помедленнее предыдущего:
res = max(map(len, ''.join(letter if letter in 'ABC' else ' ' for letter in text)).split())
вариант 3.1 (чуть-чуть покороче):
res = max(map(len, ''.join((' ', letter)[letter in 'ABC'] for letter in text).split()))
I have a list of nations, and I want to have the longest path of nations where each country chosen must begin with the same letter that ended the previous element
nations = ['albania','andorra','austria','belarus','belgium','bosnia and herzegovina',
'bulgaria','croatia','czech republic','denmark','estonia',
'finland','france','germany','greece','hungary',
'iceland','ireland','italy','latvia','liechtenstein','lithuania','luxembourg',
'macedonia','malta','moldova','monaco','montenegro','netherlands',
'norway','poland','portugal','romania','russia',
'san marino','serbia','slovakia','slovenia','spain','sweden', 'switzerland',
'ukraine','united kingdom','vatican city']
chain('spain')
>>>['spain', 'netherlands', 'slovenia', 'andorra', 'austria', 'albania']
I tried this way, but it doesn’t work
def chain(naz):
initial = naz[-1]
initials=[]
res = set()
res.add(naz)
for i in nations:
if i.startswith(initial):
initials.append(i)
for j in initials:
nations.remove(j)
res.add(j)
chain(j)
return res
Any suggestion?
Задание:
Файл содержит 100000 заглавных латинских букв. Найдите подпоследовательность подряд идущих букв, которые при этом расположены по неубыванию в алфавитном порядке (например, в ABCABA это последовательности A, B, C, A, B, A, AB, ABC, BC, AB). В ответе укажите самую длинную из встреченных в файле последовательностей. Если последовательностей такой длины встречается несколько, укажите первую.
(При этом могут встречаться последовательности типа: ABBBCCCDEEFFFF )
Файл
Мой код:
with open('file.txt', mode='r', encoding='utf-8') as f:
text = f.read()
lst = [chr(i) for i in range(ord('A'), ord('Z') + 1)]
abc = ''.join(lst) #алфавит
elems = [] #последовательности
for i in range(len(text) - 1):
passer = False
elems.append(text[i])
j = 1
while passer == False:
if len(text) < i + j + 1:
passer = True
else:
if ord(text[i + j]) - ord(elems[-1][-1]) < 2:
elems[-1] += text[i + j]
else:
passer = True
j += 1
print(max(elems, key=len))
не понимаю, почему проходят последовательности символов, аналогичные этой — FCDBCDEFCDDDEDDBAAA
Как найти самую длинную последовательность одинаковых элементов в последовательности?
У меня есть такой список:
test_list = [1, 43, 23, 4, 4, 4, 4, 4, 4, 2, 4, 4]
Наибольшая последовательность числа 4
составляет 6
элементы, как я могу реализовать алгоритм для подсчета этого?
Я пробовал это, и в результате он возвращает 8:
for item in test_list:
if item == 4:
count += 1
* количество заранее определено в более крупном алгоритме, который я реализовал
2020-04-04 01:49
4
ответа
Решение
Поиск самой длинной группы последовательных одинаковых значений можно выполнить с помощью itertools.groupby
& max
>>> from itertools import groupby
>>> test_list = [1, 43, 23, 4, 4, 4, 4, 4, 4, 2, 4, 4]
>>> max([list(group) for _, group in groupby(test_list)], key=len)
[4, 4, 4, 4, 4, 4]
Если нам нужна самая длинная группа последовательных 4
s — мы можем фильтровать по элементу, например
>>> max([list(group) for item, group in groupby(test_list) if item == 4], key=len)
[4, 4, 4, 4, 4, 4]
2020-04-04 01:57
Вероятно, есть несколько способов сделать это, но вот одна идея. Это особенно важно, если вы пытаетесь найти самую длинную последовательность в целом, а не самую длинную последовательность из числа 4.
longest_val <- 0
longest_count <- 0
prev_item <- Null
count <- 0
for all items in list
if item == prev_item
count++
if count > longest_count
longest_count <- count
longest_val <- item
else
count <- 0
prev_item <- item
(PS Это псевдокод, а не Python)
2020-04-04 02:07
Вероятно, это не самый питонический или умный код, но он должен работать.
test_list = [1, 43, 23, 4, 4, 4, 4, 4, 4, 2,1,4,4]
max_seq=0
count=1
for index, item in enumerate(test_list):
if index < len(test_list)-1:
if item == test_list[index+1]:
count += 1
print(count)
else:
if count > max_seq:
max_seq = count
count = 1
print('longest sequence: ' + str(max_seq))
2020-04-04 01:59
max_len = -1
count = 0
for x in test_list:
if x == 4:
count += 1
else:
if count > max_len:
max_len = count
count = 0
2020-04-04 01:51
У меня есть список наций, и я хочу иметь самый длинный путь наций, где каждая выбранная страна должна начинаться с той же буквы, которая заканчивала предыдущий элемент.
nations = ['albania','andorra','austria','belarus','belgium','bosnia and herzegovina',
'bulgaria','croatia','czech republic','denmark','estonia',
'finland','france','germany','greece','hungary',
'iceland','ireland','italy','latvia','liechtenstein','lithuania','luxembourg',
'macedonia','malta','moldova','monaco','montenegro','netherlands',
'norway','poland','portugal','romania','russia',
'san marino','serbia','slovakia','slovenia','spain','sweden', 'switzerland',
'ukraine','united kingdom','vatican city']
chain('spain')
>>>['spain', 'netherlands', 'slovenia', 'andorra', 'austria', 'albania']
Я пробовал так, но не работает
def chain(naz):
initial = naz[-1]
initials=[]
res = set()
res.add(naz)
for i in nations:
if i.startswith(initial):
initials.append(i)
for j in initials:
nations.remove(j)
res.add(j)
chain(j)
return res
Любое предложение?