2014-03-30 189 views
2

我試圖弄清楚如何將以下列表拆分爲基於列表中的字符的單獨列表。將Python的字符串列表拆分爲基於字符的單獨列表

list = ['@', '2014', '00:03:01', 'Matt', '"login"', '0.01', '@', '2014', '02:06:12', 'Mary', '"login"', '0.01'] 

我想在引入每個「@」符號後創建一個列表。例如,我希望輸出如下:

NewList1 = ['@', '2014', '00:03:01', 'Matt', '"login"', '0.01'] 

NewList2 = ['@', '2014', '02:06:12', 'Mary', '"login"', '0.01'] 

這可能嗎?

+2

不要將其命名你''list' list',你是在'名單覆蓋版本()'。 –

回答

4

像這樣:

>>> lst=['@', '2014', '00:03:01', 'Matt', '"login"', '0.01', '@', '2014', '02:06:12', 'Mary', '"login"', '0.01'] 
>>> [item.split() for item in ' '.join(lst).split('@') if item] 
[['2014', '00:03:01', 'Matt', '"login"', '0.01'], 
['2014', '02:06:12', 'Mary', '"login"', '0.01']] 

那麼這通常做的就是一起加入列表,重新分割它@,然後各組轉換回列表。

+0

謝謝!是否可以在創建的新列表中保留「@」字符串? – taytortot

+1

你可以在列表理解中做'['@'] + item.split()'而不是'item.split()'。 –

+1

一旦你在這些元素中有一個'@',你就會突然陷入困境。 –

1

重複查找列表中'@'元素的索引,從前一位置'@'開始,並取結果中間的所有元素。

idx, result = 0, [] 
while True: 
    try: 
     temp = my_list.index('@', idx + 1) 
     result.append(my_list[idx + 1:temp]) 
     idx = temp 
    except ValueError, e: 
     result.append(my_list[idx + 1:]) 
     break 
print result 
# [['2014', '00:03:01', 'Matt', '"login"', '0.01'], 
# ['2014', '02:06:12', 'Mary', '"login"', '0.01']] 
7

你可以使用itertools.groupby

import itertools as IT 
import operator 

seq = ['@', '2014', '00:03:01', 'Matt', '"login"', '0.01', '@', '2014', '02:06:12', 'Mary', '"login"', '0.01'] 

groups = (list(g) for k,g in IT.groupby(seq, lambda item: item=='@')) 
print(list(IT.starmap(operator.add, IT.izip(*[groups]*2)))) 

打印

[['@', '2014', '00:03:01', 'Matt', '"login"', '0.01'], ['@', '2014', '02:06:12', 'Mary', '"login"', '0.01']] 
+1

不確定'starmap'是必要的,因爲它是一個常量分組var:'groups = [['@'] + list(g)for ... if not k'可能更直接... –

相關問題