join列表中的元素 – Python

我相当新的python(几个星期),并遇到了join列表的问题。 现在,我知道一个列表可以连接成一个长的string,如下所示:

x = ['a', 'b', 'c', 'd'] print ''.join(x) 

显然这会输出:

 'abcd' 

然而,我想要做的只是join列表中的第一个和第二个string,然后join第三个和第四个等等。 总之,从上面的例子来取代输出:

 ['ab', 'cd'] 

有没有简单的方法来做到这一点? 我也许应该提到,列表中string的长度将是不可预知的,列表中string的数量也是不可预测的,尽pipestring的数量总是偶数。 所以原来的列表也可以是:

 ['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'] 

pipe他呢。 反正,任何帮助都将不胜感激,所以在此先感谢。

您可以使用切片符号的步骤:

 >>> x = "abcdefghijklm" >>> x[0::2] #0. 2. 4... 'acegikm' >>> x[1::2] #1. 3. 5 .. 'bdfhjl' >>> [i+j for i,j in zip(x[::2], x[1::2])] # zip makes (0,1),(2,3) ... ['ab', 'cd', 'ef', 'gh', 'ij', 'kl'] 

同样的逻辑也适用于列表。 string长度无关紧要,因为您只是将两个string添加在一起。

使用一个迭代器。

列表理解:

 >>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']) >>> [c+next(si, '') for c in si] ['abcde', 'fghijklmn', 'opqr'] 
  • 对于内存使用非常有效。
  • 正好有一个s遍历

生成expression式:

 >>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']) >>> pair_iter = (c+next(si, '') for c in si) >>> pair_iter # can be used in a for loop <generator object at 0x4ccaa8> >>> list(pair_iter) ['abcde', 'fghijklmn', 'opqr'] 
  • 用作迭代器

使用map,str .__ add__,iter

 >>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']) >>> map(str.__add__, si, si) ['abcde', 'fghijklmn', 'opqr'] 

next(iterator [,default])在Python 2.6中可用

只是pythonic 🙂

 >>> x = ['a1sd','23df','aaa','ccc','rrrr', 'ssss', 'e', ''] >>> [x[i] + x[i+1] for i in range(0,len(x),2)] ['a1sd23df', 'aaaccc', 'rrrrssss', 'e'] 

如果你想报警,如果列表长度是奇怪的,你可以尝试:

 [x[i] + x[i+1] if not len(x) %2 else 'odd index' for i in range(0,len(x),2)] 

好运

没有build立临时名单:

 >>> import itertools >>> s = 'abcdefgh' >>> si = iter(s) >>> [''.join(each) for each in itertools.izip(si, si)] ['ab', 'cd', 'ef', 'gh'] 

要么:

 >>> import itertools >>> s = 'abcdefgh' >>> si = iter(s) >>> map(''.join, itertools.izip(si, si)) ['ab', 'cd', 'ef', 'gh'] 
 >>> lst = ['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'] >>> print [lst[2*i]+lst[2*i+1] for i in range(len(lst)/2)] ['abcde', 'fghijklmn', 'opqr'] 

那么我会这样做,因为我不喜欢Regs ..

 t = '1. eat, food\n\ 7am\n\ 2. brush, teeth\n\ 8am\n\ 3. crack, eggs\n\ 1pm'.splitlines() print [i+j for i,j in zip(t[::2],t[1::2])] 

输出:

 ['1. eat, food 7am', '2. brush, teeth 8am', '3. crack, eggs 1pm'] 

希望这可以帮助 :)