Python基于字数统计列表元素的合并

时间:2017-04-10 09:48:09

标签: python python-2.7 python-3.x

假设我们有一个列表w,例如

w=[ 'a word', 'more words', 'word', 'word again', 'word', 'r', 'word', 'www', 'easy word easy', 'last word' ]

并且,上面列表中每个元素的字数分别为2,2,1,2,1,1,1。 现在,我希望以满足条件的方式组合它。新创建的列表中的每个元素应至少为字长3,这意味着,考虑下一个要合并的元素,直到达到所需长度。
每个连接点都会添加空格。请注意,最后一个元素无论其长度如何都将被合并。

因此,列表现在变为,

l=[ 'a word more words', 'word word again', 'word r word', 'www easy word easy', 'last word' ]

我尝试了很多方法但得到了不相关的结果。在某些情况下,会跳过最后一项。有什么建议吗?

5 个答案:

答案 0 :(得分:1)

迭代器+生成器将完成这项工作

def get_words_count(words_str: str):
    return words_str.strip().count(' ') + 1


def get_words_strings_of_desired_words_count(words_strings,
                                             desired_words_count):
    unused_words_strings = iter(words_strings)
    for words_string in unused_words_strings:
        while get_words_count(words_string) < desired_words_count:
            try:
                next_words_string = next(unused_words_strings)
            except StopIteration:
                break
            words_string = ' '.join([words_string, next_words_string])
        yield words_string


desired_words_strings = list(
    get_words_strings_of_desired_words_count(words_strings=w,
                                             desired_words_count=3))

此外,你需要检查我们是否正确使用正确的单词

答案 1 :(得分:0)

w=[ 'a word', 'more words', 'word', 'word again', 'word', 'r', 'word', 'www', 'easy word easy', 'last word' ]
l = []
current = []
for e in w:
    if not current:
        current = e.split(' ')
    else:
        current.extend(e.split(' '))
    if len(current) >= 3:
        l.append(' '.join(current))
        current.clear()
if (len(current) > 0):
    l.append(' '.join(current))
print(l)

最后一个if语句会附加剩余的单词,即使它少于三个。该脚本将提供以下输出:

['a word more words', 'word word again', 'word r word', 'www easy word easy', 'last word']

答案 2 :(得分:0)

我对你提到的最后一个元素的条件有点困惑,但试试这个:

w=[ 'a word', 'more words', 'word', 'word again', 'word',
  'r', 'word', 'www', 'easy word easy', 'last word' ]

def wordcombine(arr,n):
    temp_arr=[]
    main_arr=[]
    for num in arr:
        if type(num.split(' '))==list:
            temp_arr.append(num)
        else:
            temp_arr=temp_arr+num.split(' ')
        if len(temp_arr)>=n:
            main_arr.append(' '.join(temp_arr))
            temp_arr=[]
    main_arr.append(' '.join(temp_arr))
    return main_arr

wordcombine(w,3)
['a word more words', 'word word again', 'word r word', 'www easy word easy', 
 'last word']

答案 3 :(得分:0)

忽略结束案例

您可以使用迭代器逐步使用列表。

def ensure_length(length, wordslist):
    w_iter = iter(wordslist)
    try:
        while(1):
            new_string = next(w_iter)
            while len(new_string.split(' ')) < length:
                new_string += (' ' + next(w_iter))
            yield new_string
            new_string = ''
    except StopIteration:
        if new_string is not '':
            yield new_string

try, except语句捕获StopIteration并返回最后一个值。没有它,StopIteration异常将会逃脱。

我没有完全理解你应该用最后一个字符串做什么的规范。此函数可能会返回字长太小的最后一项。

list(ensure_length(3, w))

将返回:

['a word more words',
 'word word again',
 'word r word',
 'www easy word easy',
 'last word']

结束案例

您还可以通过维护单词缓冲区来确保返回列表中的最后一个元素也满足条件,从而改进这一点:

def ensure_length(length, wordslist):
    w_iter = iter(wordslist)
    buffer = list()

    def buffer_length(buffer):
        return sum(map(lambda x: len(x.split(' ')), buffer))

    def buffer_pop(buffer, w_iter):
        while buffer_length(buffer[1:]) < length:
            buffer.append(next(w_iter))
        return buffer.pop(0)

    try:
        while(1):
            new_string = buffer_pop(buffer, w_iter)
            while len(new_string.split(' ')) < length:
                new_string += (' ' + buffer_pop(buffer, w_iter))
            yield new_string
            new_string = ''

    except StopIteration:
        if len(new_string) is not 0:
            new_string += ' '
        yield new_string + ' '.join(buffer)

将返回:

['a word more words',
 'word word again',
 'word r word',
 'www easy word easy last word']

答案 4 :(得分:0)

递归解决方案:

w=[ 'a word', 'more words', 'word', 'word again', 'word', 'r', 'word', 'www', 'easy word easy', 'last word'  ]

def number_of_word(sentence):
    return len(sentence.split())

def merge_sentence(lst, accu=[""]):
    if not lst:
        return accu
    if number_of_word(accu[-1]) >= 3:
        return merge_sentence(lst[1:], accu + [lst[0]])
    else:
        accu[-1] = accu[-1] + " " + lst[0] if accu[-1] else lst[0]
        return merge_sentence(lst[1:], accu)

print merge_sentence(w)