2014-03-30 190 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'可能更直接... –

相关问题