2016-09-16 96 views
0

我在python中有一个列表,它包含字母和数字元素,比如list = ["a", 1, 2, 3, "b", 4, 5, 6],我想将它分成2个列表,其中包含字母后面的数字,所以list1 = [1, 2, 3]list2 = [4, 5, 6]ab元素可能是相反的顺序,但通常情况下,我想将ab元素中的数字元素存储在单独的列表中。我想出了创建一个循环与条件最简单的办法:在Python中只对列表的一部分进行迭代

#Generating a list for numeric elements following "a": 
    for e in list[list.index("a")+1:]: 
     if not str.isdigit(e): 
     break 
     else: 
     list1.append(e) 

"b"后做同样为list2和数字元素。 但是会不会有更优雅的解决方案?我对Python很陌生,但我已经看到了漂亮的单线程构造,在我的情况下是否会出现这样的情况?提前致谢。

+0

你能给予一个完整的代码示例澄清问题多一点,比如? – linusg

+0

现在更好:D,但我认为标题仍然令人困惑......您是否想遍历列表并跳过特定元素或其他内容? – linusg

回答

4

这样的事情,也许呢?

>>> import itertools 
>>> import numbers 
>>> lst = ["a", 1, 2, 3, "b", 4, 5, 6] 
>>> groups = itertools.groupby(lst, key=lambda x: isinstance(x, numbers.Number)) 
>>> result = [[x for x in group_iter] for is_number, group_iter in groups if is_number] 
>>> result 
[[1, 2, 3], [4, 5, 6]] 

这里是一个不那么“性感”的版本,输出(group_key, group_numbers)元组对的列表:

>>> import itertools 
>>> import numbers 
>>> lst = ["a", 1, 2, 3, "b", 4, 5, 6] 
>>> groups = itertools.groupby(lst, key=lambda x: isinstance(x, numbers.Number)) 
>>> group_key = None 
>>> result = [] 
>>> for is_number, group_iter in groups: 
...  if not is_number: 
...   for x in group_iter: 
...    group_key = x 
...  else: 
...   result.append((group_key, [x for x in group_iter])) 
>>> result 
[('a', [1, 2, 3]), ('b', [4, 5, 6])] 

请注意,这是一个快速和肮脏的版本,预计将输入数据是良好形成。

+0

像这样的解决方案,我自己想到了,但无法实现,谢谢分享 – Netwave

3

这里有一个功能性的形式给出:

>>> l = ["a", 1, 2, 3, "b", 4, 5, 6] 
>>> dig = [x for (x, y) in enumerate(l) if type(y) is str] + [len(l)] 
>>> dig 
[0, 4, 8] 
>>> slices = zip(map(lambda x:x+1, dig), dig[1:]) 
>>> slices 
[(1, 4), (5, 8)] 
>>> lists = map(lambda (i, e): l[i:e], slices) 
>>> lists 
[[1, 2, 3], [4, 5, 6]] 

首先,我们获得与字母的指数,通知我们需要的列表的大小就知道它的结束:

[x for (x, y) in enumerate(l) if type(y) is str] + [len(l)] 

然后我们得到的对,其中列表是片:

zip(map(lambda x:x+1, dig), dig[1:]) 

最后,我们从origi得到每片最终列表:

map(lambda (i, e): l[i:e], slices) 
0

您可以使用切片:

list = ["a", 1, 2, 3, "b", 4, 5, 6] 
lista = list[list.index('a')+1:list.index('b')] 
listb = list[list.index('b')+1:] 
0

另一种方法(仅Python 3中):

def chunks(values, idx=0): 
    ''' Yield successive integer values delimited by a character. ''' 

    tmp = [] 
    for idx, val in enumerate(values[1:], idx): 
     if not isinstance(val, int): 
      yield from chunks(values[idx + 1:], idx) 
      break 
     tmp.append(val) 
    yield tmp 


>>> values = ['a', 1, 2, 3, 'b', 4, 5, 6] 
>>> list(chunks(values)) 
[[4, 5, 6], [1, 2, 3]]