通过Y冷凝X,Y

时间:2013-03-25 23:41:51

标签: python zip

我有一组像x,y:

这样的数据
a = [([2,-2,0.29]), 0)([-2,0,1.9]), 2),([ 2,1,2.35]),3),([2, -3,2.96]), 3)

有没有办法用y缩小,以便我得到([2,1,2.35]),([2,-3,2.96])?我想把它们放在一起,这样我就可以找到两个x中每个x的最大x和y。如您所见,我的x术语实际上是x,y,z。

修改的 这是我试过的代码。我需要一种方法来使它成为我不必在'3'中编码的地方。

import numpy as np
a = [([2, -2, 0.29], 0), ([-2, 0, 1.9], 2), ([2, 1, 2.35], 3), ([2, -3, 2.96], 3)]
b = [0,2,3,3,5,5,6,6,6,8,8,9,10,11,11,11,16,16,16,16,17,18,19,20,20,20,23,24,25,26,28]
cur = []
for x,y in a:
if y == 3:
    cur.append(x)
    b.remove(3)

3 个答案:

答案 0 :(得分:1)

您可以执行类似的操作将它们放入默认字典中。

from collections import defaultdict
new_data = defaultdict()
for data_point in a:
 if data_point[1] in new_data:
   new_data[data_point[1]].append(data_point[0])
 else:
   new_data[data_point[1]] = [data_point[0]]

然后获取您可以执行的每个部分的最大值

for item in new_data.items():
     print "For key: ",
     print item[0]
     print max([data[0] for data in item[1]])
     print max([data[1] for data in item[1]])
     print max([data[2] for data in item[1]])
     print "---------"

答案 1 :(得分:0)

我认为有两种解决方案。

如果您知道所有相等y值的组彼此相邻(例如,因为您的列表已排序),则可以使用itertools.groupby来组合相邻的值:

from itertools import groupby

def condense_on_y(lst):
    return [group[0][1], [x for x,y in group]
            for group in groupby(lst, lambda item: item[1])]

如果您的列表可能不合适,那么我认为您需要将内容放在另一个数据结构中。以下是使用defaultdictitertools.chain.from_iterable

的解决方案
from collections import defaultdict

def condense(lst):
    dct = defaultdict(list)
    for x, y in lst:
        values[y].append(x)

    return list(dct.items()) # list(...) wrapper not needed in Python 2

答案 2 :(得分:0)

In [1]: a = [([2, -2, 0.29], 0), ([-2, 0, 1.9], 2), ([2, 1, 2.35], 3), ([2, -3, 2.96], 3)]

In [2]: result={}

In [3]: for x in a:
   ...:     result.setdefault(x[1],[]).append(x[0])
   ...:     

In [4]: result[3]
Out[4]: [[2, 1, 2.35], [2, -3, 2.96]]