Most pythonic way to interleave two strings

前端 未结 14 1040
暗喜
暗喜 2020-11-27 14:34

What\'s the most pythonic way to mesh two strings together?

For example:

Input:

u = \'ABCDEFGHIJKLMNOPQRSTUVWXYZ\'
l = \'abcdefghijklmnopqrst         


        
相关标签:
14条回答
  • 2020-11-27 15:08

    You could also do this using map and operator.add:

    from operator import add
    
    u = 'AAAAA'
    l = 'aaaaa'
    
    s = "".join(map(add, u, l))
    

    Output:

    'AaAaAaAaAa'
    

    What map does is it takes every element from the first iterable u and the first elements from the second iterable l and applies the function supplied as the first argument add. Then join just joins them.

    0 讨论(0)
  • 2020-11-27 15:11

    Faster Alternative

    Another way:

    res = [''] * len(u) * 2
    res[::2] = u
    res[1::2] = l
    print(''.join(res))
    

    Output:

    'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'
    

    Speed

    Looks like it is faster:

    %%timeit
    res = [''] * len(u) * 2
    res[::2] = u
    res[1::2] = l
    ''.join(res)
    
    100000 loops, best of 3: 4.75 µs per loop
    

    than the fastest solution so far:

    %timeit "".join(list(chain.from_iterable(zip(u, l))))
    
    100000 loops, best of 3: 6.52 µs per loop
    

    Also for the larger strings:

    l1 = 'A' * 1000000; l2 = 'a' * 1000000
    
    %timeit "".join(list(chain.from_iterable(zip(l1, l2))))
    1 loops, best of 3: 151 ms per loop
    
    
    %%timeit
    res = [''] * len(l1) * 2
    res[::2] = l1
    res[1::2] = l2
    ''.join(res)
    
    10 loops, best of 3: 92 ms per loop
    

    Python 3.5.1.

    Variation for strings with different lengths

    u = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    l = 'abcdefghijkl'
    

    Shorter one determines length (zip() equivalent)

    min_len = min(len(u), len(l))
    res = [''] * min_len * 2 
    res[::2] = u[:min_len]
    res[1::2] = l[:min_len]
    print(''.join(res))
    

    Output:

    AaBbCcDdEeFfGgHhIiJjKkLl
    

    Longer one determines length (itertools.zip_longest(fillvalue='') equivalent)

    min_len = min(len(u), len(l))
    res = [''] * min_len * 2 
    res[::2] = u[:min_len]
    res[1::2] = l[:min_len]
    res += u[min_len:] + l[min_len:]
    print(''.join(res))
    

    Output:

    AaBbCcDdEeFfGgHhIiJjKkLlMNOPQRSTUVWXYZ
    
    0 讨论(0)
  • 2020-11-27 15:12

    With join() and zip().

    >>> ''.join(''.join(item) for item in zip(u,l))
    'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'
    
    0 讨论(0)
  • 2020-11-27 15:12

    Feels a bit un-pythonic not to consider the double-list-comprehension answer here, to handle n string with O(1) effort:

    "".join(c for cs in itertools.zip_longest(*all_strings) for c in cs)
    

    where all_strings is a list of the strings you want to interleave. In your case, all_strings = [u, l]. A full use example would look like this:

    import itertools
    a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    b = 'abcdefghijklmnopqrstuvwxyz'
    all_strings = [a,b]
    interleaved = "".join(c for cs in itertools.zip_longest(*all_strings) for c in cs)
    print(interleaved)
    # 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'
    

    Like many answers, fastest? Probably not, but simple and flexible. Also, without too much added complexity, this is slightly faster than the accepted answer (in general, string addition is a bit slow in python):

    In [7]: l1 = 'A' * 1000000; l2 = 'a' * 1000000;
    
    In [8]: %timeit "".join(a + b for i, j in zip(l1, l2))
    1 loops, best of 3: 227 ms per loop
    
    In [9]: %timeit "".join(c for cs in zip(*(l1, l2)) for c in cs)
    1 loops, best of 3: 198 ms per loop
    
    0 讨论(0)
  • 2020-11-27 15:13

    Jim's answer is great, but here's my favorite option, if you don't mind a couple of imports:

    from functools import reduce
    from operator import add
    
    reduce(add, map(add, u, l))
    
    0 讨论(0)
  • 2020-11-27 15:17

    I like using two fors, the variable names can give a hint/reminder to what is going on:

    "".join(char for pair in zip(u,l) for char in pair)
    
    0 讨论(0)
提交回复
热议问题