在Python中将零之间的数字拆分为单独的列表

在Python中将零之间的数字拆分为单独的列表,python,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

我不能用谷歌取得任何进展,因为我不认为我能很好地将其转化为搜索查询

我有以下清单:

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个零

非零唯一值的数量会有所不同,每个唯一值的计数也会有所不同,每个唯一值之间的零数量也会有所不同。这些数字甚至可能不是唯一的,但这是极不可能的,我准备假设它们是唯一的

我需要保留唯一数字出现的顺序


对不起,我最初的问题含糊不清。我觉得很难解释,但我确信答案很简单。

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

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

编辑:修改代码以匹配更新的问题。

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

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)

另一种解决方案,但没有itertools 编辑:随着Op对问题的改变,这里是另一个适合OPs需求的解决方案

# 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
#初始化循环
i=0
asplit=[]
最后一个=无
而i
您可以使用
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]]

怎么样
zip(*[(如果x中x代表x)]*2)
?你能更详细地描述一下你的问题吗?你想如何形成结果还不太清楚。第一条评论中建议的解决方案假设结果应该由成对的数字组成,但对您的问题还有其他可能的解释。还不清楚您尝试了什么,以及具体是什么给您带来了问题。@vaultah从问题的标题来看,我认为这不是OP想要的,但我承认不清楚。所以您想要一个单元素列表作为返回值?为什么不简单地列出一系列数字呢?还不清楚具体是什么原因给您造成了问题。OP声明我需要保留唯一数字出现的顺序。更新了回答者询问的
[[23.1],[34.5]
,但这输出了
[23.1,34.5]
,通过在itertools.groupby(a,bool)中使用
[[next(vals)]对k,vals使用
[[next(vals)]可以轻松修复,如果k]当然,你问了
[[23.1],[34.5]]
但是这给出了
[[23.1,23.1,23.1],[34.5,34.5]]
@FujiApple是的,我已经编辑了答案,我以为他想要在不删除的情况下拆分列表duplicates@SvenMarnach我明白了,富士苹果把我弄糊涂了,我想我误解了这个问题。无论如何,现在我已经提供了两种解决方案