如何在Python中组织在负值和正值之间交替的数据

时间:2013-08-16 20:12:09

标签: python list

我在一个文件中有一个数据点列表,我将其插入到我构建的链表类中 对文件进行组织,使得存在一系列负值,然后是来回交替的一系列正值。 一个例子:

-2323 

-2324

-53434

-1027

-34232

 343434

 5657

 6565

 6500

-343434

-3434

-565

5845

4667

5453

98356

这种模式持续多行。每个部分的负值或正值的数量永远不会相同。

我想以某种方式分离这些值,以便第一个列表对象包含第一组正数到负数,在这种情况下从-23236500。下一个列表对象将包含从-34343498356的值,依此类推。

我无法弄清楚如何让python知道在读取文件时如何分离这些数据集。 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

import itertools
groups = itertools.groupby(l, lambda x : x > 0)
result = [list(groups[i][1]) + list(groups[i + 1][1]) for i in range(0, len(groups), 2)]

这将首先按元素是否为正对元素进行分组,然后将组中的相邻对组合成单个列表,然后该列表将成为结果列表的元素。

编辑:我一直忘记了itertools使对象不能像普通的迭代一样工作。

以下情况实际上应该有效,如果有点混乱。

import itertools
groups = itertools.groupby(l, lambda x : x > 0)
grouplist = [[i for i in y] for (x, y) in groups]
result = [grouplist[i] + grouplist[i + 1] for i in range(0, len(grouplist), 2)]

答案 1 :(得分:2)

def takeSection(sequence):
    it = iter(sequence)
    a = -1
    group = []
    while True:
        try:
            a, last = next(it), a
        except StopIteration:
            if group:
                yield group
            return
        if a < 0 and last >= 0:
            if group:
                yield group
            group = [a]
        else:
            group.append(a)

>>> sequence = [-2323, -2324, -53434, -1027, -34232, 343434, 5657, 6565, 6500, -343434, -3434, -565, 5845, 4667, 5453, 98356]
>>> list(takeSection(sequence))
Out[2]: 
[[-2323, -2324, -53434, -1027, -34232, 343434, 5657, 6565, 6500],
 [-343434, -3434, -565, 5845, 4667, 5453, 98356]]

修改

如果要对一对值中的第一个值进行过滤,则可以更改if条件以进行测试。例如,您可以将条件行更改为if a[0] < 0 and last[0] >=0,并且还需要将a初始化为a = (-1, -1)

但是我很想做出一个更通用和有用的功能。

def sections(sequence, key):
    it = iter(sequence)
    a = placeholder = object()
    group = []
    while True:
        try:
            a, last = next(it), a
        except StopIteration:
            if group:
                yield group
            return
        if last is not placeholder and key(a, last):
            if group:
                yield group
            group = [a]
        else:
            group.append(a)

>>> sequence = [(-2323, -7465), (-2324, -7687), (-53434, -1027), (-34232, 343434), (5657, 6565), (6500, 978987), (-343434, -987), (-3434, -565), (-98, -8798), (-89898, -898), (5845, 4667), (5453, 98356)]
>>> list(sections(sequence, key=lambda current, last: current[0] < 0 and last[0] >= 0))
Out[1]:
[[(-2323, -7465), (-2324, -7687), (-53434, -1027), (-34232, 343434), (5657, 6565), (6500, 978987)],
 [(-343434, -987), (-3434, -565), (-98, -8798), (-89898, -898), (5845, 4667), (5453, 98356)]]