将Python字符串列表根据字符拆分为单独的列表

3
我正在尝试找出如何根据列表中的一个字符将以下列表拆分成单独的列表。
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']

这是可能的吗?

3
不要将你的列表命名为list,否则会覆盖内置的 list() 函数。 - CT Zhu
4个回答

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,因为它是一个常量分组变量:groups = [['@'] + list(g) for ... if not k 可能更加直观... - Jon Clements

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']] 

所以基本上这个功能是将列表连接在一起,重新用@进行分割,然后将每个组转换成列表。

谢谢!在创建新列表时,是否有可能保留'@'的字符串? - taytortot
1
在列表推导式中,您可以使用['@']+item.split()而不是仅使用item.split() - anon582847382
2
一旦在这些元素中的任何一个中出现了 @,你就会陷入麻烦。 - CT Zhu
1
如果lst中的任何项包含空格,则会产生错误结果。 - jfs
从用户的输入示例中,我认为可以假设元素中没有其他的@或空格出现。 - anon582847382

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']]

0

这似乎是 more_itertools.split_before 的完美应用。结果的一行代码既简洁又清晰。

from more_itertools import split_before

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

processed = [sublist for sublist in split_before(original, lambda i: i == '@')]

print(processed)

输出(为了清晰起见添加换行符):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接