2013-03-25 13 views
0

У меня есть набор данных, как это в формате х, у:конденсаторные X, Y на Y

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

есть способ конденсироваться на у, так что я хотел бы получить ([2,1, 2.35]), ([2, -3,2.96]) вместе? Я хотел бы собрать их вместе, чтобы найти max x и y каждого из двух x. Как вы можете видеть, мой x термин фактически является x, y, z сам по себе.

EDIT Это код, который я пробовал. Мне нужен способ сделать это там, где мне не нужно вводить код в «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) 
+0

Конечно, это возможно. Вы пытались написать какой-нибудь код, чтобы попробовать? Что случилось? –

+0

Ваши скобки не совпадают правильно ... так трудно понять, что задается –

+1

Возможно, что 'a = [([2, -2, 0.29], 0), ([-2, 0, 1.9], 2), ([2, 1, 2.35], 3), ([2, -3, 2.96], 3)] 'это то, что вы имели в виду? – mgamba

ответ

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]] 
+0

Это именно то, что я искал. Наверное, мне нужно больше смотреть в словари. – pioneer903

+0

Вы можете объяснить, как это работает более подробно? Или направьте меня в документацию. – pioneer903

+0

http://docs.python.org/2/library/stdtypes.html#dict.setdefault – namit

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 "---------" 
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])] 

Если список возможно, не в порядке, тогда я думаю, вам нужно будет поместить вещи в другую структуру данных. Вот решение, используя defaultdict и itertools.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 
Смежные вопросы