Как найти длину цепочки в питоне

вариант 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]

Если нам нужна самая длинная группа последовательных 4s — мы можем фильтровать по элементу, например

>>> 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

Любое предложение?

Понравилась статья? Поделить с друзьями:
  • Ошибка 0xc000005 windows 10 x64 как исправить
  • Как найти удаленные вкладки на телефоне
  • Как найти имя канала на ютубе
  • Как найти алоэ в зе форест
  • Как найти координаты вектора имея координаты точек