迭代Python中只有一部分列表

时间:2016-09-16 08:42:41

标签: python iteration

我在python中有一个列表,它包含字母和数字元素,比如list = ["a", 1, 2, 3, "b", 4, 5, 6],我想把它分成2个列表,包含跟随字母字符的数字,所以{{1} }和list1 = [1, 2, 3]list2 = [4, 5, 6]a元素的顺序可能相反,但一般来说,我希望将ba元素后面的数字元素存储在不同的列表中。我想出的最简单的解决方案是创建一个条件循环:

b

我会 #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) list2之后的数字元素类似地执行此操作。 但是会有更优雅的解决方案吗?我是Python的新手,但我看过漂亮的单线结构,在我的情况下会有类似的东西吗?提前致谢。

4 个答案:

答案 0 :(得分: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])]

请注意,它是一个快速而又脏的版本,它希望输入数据格式正确。

答案 1 :(得分: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:])

最后,我们从原始列表中获取每个切片:

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

答案 2 :(得分: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:]

答案 3 :(得分: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]]