将零之间的数字拆分为Python

时间:2016-08-23 10:25:23

标签: python

我没有随时随地使用谷歌,因为我不认为我可以很好地将其纳入搜索查询。

我有这个清单:

a = [0.0, 0.0, 0.0, 23.1, 23.1, ... , 23.1, 0.0, ... , 0.0, 34.5, ...,  34.5, 0.0, 0.0, 0.0]

我想进入这个:

asplit = [[23.1], [34.5]]

编辑:

所以我改变了上面例子中的代码。我有一个列表,让我们说前面有234个零,然后是23.1重复90次,然后是987个零,然后是65个出现的34.5,然后是34个零。

非零唯一值的数量会有所不同,每个唯一值的计数也会有所不同,每个唯一数字之间的零数也会有所不同。这些数字甚至可能不是唯一的,但这种可能性很小,而且我已经准备好假设它们是。

我需要保留唯一编号出现的顺序。

很抱歉我的初步问题模糊不清。我觉得很难解释,但我相当肯定答案很简单。

4 个答案:

答案 0 :(得分:3)

要获取列表a中所有连续非零数字运行的第一个元素,您可以使用

from itertools import groupby
result = [next(vals) for k, vals in groupby(a, bool) if k]

编辑:代码经过调整以匹配更新的问题。

答案 1 :(得分:3)

您可以使用set来实现它。由于要保留数字顺序,您可以这样做:

 >>> my_list = [23.1, 23.1, 23.1, 0.0, 0.0, 34.5,  34.5, 0.0, 0.0, 0.0]
 >>> seen = set()
 >>> seen_add = seen.add
 >>> [[x] for x in my_list if x and not (x in seen or seen_add(x))]
[[23.1], [34.5]]

否则,如果没有必要订购,您可以通过以下方式实现:

>>> my_list = [23.1, 23.1, 23.1, 0.0, 0.0, 34.5,  34.5, 0.0, 0.0, 0.0]
>>> map(lambda x: [x], set(x for x in my_list if x))
[[34.5], [23.1]]

答案 2 :(得分:2)

以下是原始问题的可能解决方案:

import itertools

a = [0.0, 0.0, 0.0, 23.1, 23.2, 0.0, 0.0, 0.0, 34.5, 34.6, 0.0, 0.0, 0.0]
b = [list(x[1]) for x in itertools.groupby(a, lambda x: x == 0) if not x[0]]
print(b)

如果您不希望在子列表中包含重复的元素,那么这就是解决方案:

import itertools

a = [0.0, 0.0, 0.0, 23.1, 23.2, 0.0, 0.0, 0.0, 34.5, 34.6, 0.0, 0.0, 0.0]
b = [list(set(x[1])) for x in itertools.groupby(a, lambda x: x == 0) if not x[0]]
print(b)

答案 3 :(得分:1)

另一种解决方案,但没有itertools 编辑:由于Op改变了相当多的问题,这里有另一种适合OP需要的解决方案

# init the loop 
i = 0
asplit = []
last = None
while i < len(a)-1:
    # add non-zero number, that is new
    cand = a[i]
    if cand != last and cand != 0.0:
        last = cand
        asplit.append([last])
    i += 1