Сжатие списка слов - PullRequest
       0

Сжатие списка слов

0 голосов
/ 24 февраля 2020

Я работаю над алгоритмом сжатия для строки (содержащей список слов, разделенных запятыми). Результатом будет строка, подобная 'word-count'. Например: 'a, a, b, c' -> 'a-2, b-1, c -1'

Не уверен, почему это не работает

def word_compression(words):
    words=words.split(",")
    print(words)
    prev=words[0]
    count=0
    #record=dict()
    s=""
    for i in range (len(words)):
        word=words[i].strip()
        if(word==prev):
            count+=1
            print(word,count)
        else:
            #new word
            #record[prev]=count
            print(word,prev)
            if(s==""):
                s=prev+"-"+str(count)
            else:
                s=s+", "+prev+"-"+str(count)
            print("changed from: ",prev, word)
            count=1
            prev=word

    print(prev,count)
    s=s+", "+prev+"-"+str(count)
    return s

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Я бы предпочел решение, используя itertools.groupby, чтобы получить счет, а затем ', '.join, чтобы объединить результаты:

from itertools import groupby
from re import split

def word_compression(words):
    words = split(r',\s*', words)
    counts = (f'{word}-{sum(1 for _ in group)}' for word, group in groupby(words))
    return ', '.join(counts)

print(word_compression("1,1,1,1,1,1, 2, 2, 2, 2, 3, 3, 1, 1, 1"))
# 1-6, 2-4, 3-2, 1-3
0 голосов
/ 24 февраля 2020

Или:

l = ["a", "a", "b", "c"]

def my_histogram(l):
    res = {}
    for i in l:
        if i in res:
            res[i] += 1
        else:
            res[i] = 1
    return(res)

want = my_histogram(l)

print([k + "->" + str(v) for k, v in want.items()])

# ['a->2', 'b->1', 'c->1']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...