比较列表中的值以创建匹配列表

时间:2016-08-10 10:06:52

标签: python

我有这种风格的列表:

[ [x,y,z] , [x1,y1,z1] , [...]].

我的问题是我想以某种方式排序值创建一个新列表。在第一步中,我想制作一个列表,对于所有相同的x和y,我有相应的z值。这是一个例子:

原始数据:

[[1,2,5],[1,2,6],[1,2,7],[2,2,10],[2,2,11]] 

已处理的数据:

[[1,2 [5,6,7]],[2,2[10,11]]

在最后一步,我希望有这样的清单:

[[x values], [y values], [z minimum values], [z length]]
[[1,2],[2,2],[5,10],[3,2]]

首先,我尝试使用x和y的所有可能组合制作一个列表(在我的数据中它不是无限的),但后来我认为只比较连续值会更容易,但我没想到它。

1 个答案:

答案 0 :(得分:2)

如果您刚开始,将问题分解为更小的问题并逐步解决将是有用的。

第一步,最简单的方法可能是首先使用字典收集信息。

您浏览原始列表中的所有三元组并创建一个字典,其中每个键都是不同的(x,y)对。值将是列表中的z值。

import collections

l = [[1,2,5],[1,2,6],[1,2,7],[2,2,10],[2,2,11]]
mapping = collections.defaultdict(list)

for x, y, z in l:
    mapping[(x, y)].append(z)

# >> defaultdict(<type 'list'>, {(1, 2): [5, 6, 7], (2, 2): [10, 11]})

我们正在使用defaultdictlist构造函数,因此我们无需手动检查列表中是否已存在项目。

现在我们有了一个字典,很容易构建第一个列表。我们只需要遍历所有键和值,并创建一个正确的列表格式。

intermediate_list = [[x, y, zs] for (x, y), zs in mapping.iteritems()]
# >> [[1, 2, [5, 6, 7]], [2, 2, [10, 11]]]

在第三步中,我们可以再次使用我们的字典。列表中的第一个条目将是字典中的所有键,然后我们需要继续添加最小值和最大值。

final_list = []
minimums = []
lengths = []

for (x, y), zs in mapping.iteritems():
    final_list.append([x, y])
    minimums.append(min(zs))
    lengths.append(len(zs))

final_list.append(minimums)
final_list.append(lengths)

# >> [[1, 2], [2, 2], [5, 10], [3, 2]]