Concatenate elements of a tuple in a list in python

前端 未结 3 1532
执笔经年
执笔经年 2020-12-09 16:38

I have a list of tuples that has strings in it For instance:

[(\'this\', \'is\', \'a\', \'foo\', \'bar\', \'sentences\')
(\'is\', \'a\', \'foo\', \'bar\', \'         


        
相关标签:
3条回答
  • 2020-12-09 17:09

    The list comprehension creates temporary strings. Just use ' '.join instead.

    >>> words_list = [('this', 'is', 'a', 'foo', 'bar', 'sentences'),
    ...               ('is', 'a', 'foo', 'bar', 'sentences', 'and'),
    ...               ('a', 'foo', 'bar', 'sentences', 'and', 'i'),
    ...               ('foo', 'bar', 'sentences', 'and', 'i', 'want'),
    ...               ('bar', 'sentences', 'and', 'i', 'want', 'to'),
    ...               ('sentences', 'and', 'i', 'want', 'to', 'ngramize'),
    ...               ('and', 'i', 'want', 'to', 'ngramize', 'it')]
    >>> new_list = []
    >>> for words in words_list:
    ...     new_list.append(' '.join(words)) # <---------------
    ... 
    >>> new_list
    ['this is a foo bar sentences', 
     'is a foo bar sentences and', 
     'a foo bar sentences and i', 
     'foo bar sentences and i want', 
     'bar sentences and i want to', 
     'sentences and i want to ngramize', 
     'and i want to ngramize it']
    

    Above for loop can be expressed as following list comprehension:

    new_list = [' '.join(words) for words in words_list] 
    
    0 讨论(0)
  • 2020-12-09 17:16

    You can do this efficiently like this

    joiner = " ".join
    print map(joiner, sixgrams)
    

    We can still improve the performance using list comprehension like this

    joiner = " ".join
    print [joiner(words) for words in sixgrams]
    

    The performance comparison shows that the above seen list comprehension solution is slightly faster than other two solutions.

    from timeit import timeit
    
    joiner = " ".join
    
    def mapSolution():
        return map(joiner, sixgrams)
    
    def comprehensionSolution1():
        return ["".join(words) for words in sixgrams]
    
    def comprehensionSolution2():
        return [joiner(words) for words in sixgrams]
    
    print timeit("mapSolution()", "from __main__ import joiner, mapSolution, sixgrams")
    print timeit("comprehensionSolution1()", "from __main__ import sixgrams, comprehensionSolution1, joiner")
    print timeit("comprehensionSolution2()", "from __main__ import sixgrams, comprehensionSolution2, joiner")
    

    Output on my machine

    1.5691678524
    1.66710209846
    1.47555398941
    

    The performance gain is most likely because of the fact that, we don't have to create the join function from the empty string everytime.

    Edit: Though we can improve the performance like this, the most pythonic way is to go with generators like in lvc's answer.

    0 讨论(0)
  • 2020-12-09 17:25

    For a lot of data, you should consider whether you need to keep it all in a list. If you are processing each one at a time, you can create a generator that will yield each joined string, but won't keep them all around taking up memory:

    new_data = (' '.join(w) for w in sixgrams)
    

    if you can get the original tuples also from a generator, then you can avoid having the sixgrams list in memory as well.

    0 讨论(0)
提交回复
热议问题