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']
希望这可以帮助 :)