Python:使用扭曲独特的列表

时间:2012-06-22 10:53:47

标签: python list

假设我有一个清单:

L = [15,16,57,59,14]

列表包含不太准确的mesurements:元素的实际值是记录值的+ -2。所以14,15和16可以具有相同的值。我想要做的是独特地列出该列表,同时考虑到测量误差。因此输出应该是:

l_out = [15,57]

l_out = [(14,15,16),(57,59)]

使用for循环生成任何结果都没有问题。但是,我很好奇是否有更优雅的解决方案。想法很受欢迎。

4 个答案:

答案 0 :(得分:5)

正如lazyr在评论中指出的那样,已经发布了类似的问题here。使用群集模块解决我的问题的方法是:

>>> from cluster import *
>>> L = [15,16,57,59,14]
>>> cl = HierarchicalClustering(L, lambda x,y: abs(x-y))
>>> cl.getlevel(2)
[[14, 15, 16], [57, 59]]

或(获取具有每组平均值的唯一列表):

>>> [mean(cluster) for cluster in cl.getlevel(2)]
[15, 58]

答案 1 :(得分:2)

如果你想要标准的lib python,itertool的{​​{1}}是你的朋友:

groupby

答案 2 :(得分:2)

以下是我用纯Python方法做的事情:

s = sorted(L)
b = [i + 1 for i, (x, y) in enumerate(zip(s, s[1:])) if y > x + 2]
result = [s[i:j] for i, j in zip([None] + b, b + [None])]

此处b是“中断”列表,即群集结束的索引。

答案 3 :(得分:-1)

For循环是最简单的方法,但如果你真的想要单行代码:
l_out = list(set(tuple([tuple(filter(lambda i: abs(item - i) < 3, L)) for item in L])))
虽然很不清楚,但我更喜欢版本:)