我没有随时随地使用谷歌,因为我不认为我可以很好地将其纳入搜索查询。
我有这个清单:
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个零。
非零唯一值的数量会有所不同,每个唯一值的计数也会有所不同,每个唯一数字之间的零数也会有所不同。这些数字甚至可能不是唯一的,但这种可能性很小,而且我已经准备好假设它们是。
我需要保留唯一编号出现的顺序。
很抱歉我的初步问题模糊不清。我觉得很难解释,但我相当肯定答案很简单。
答案 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