2016-08-06 2 views
0

там (предпочтительно элегантный) способ в Python для принятия массива пара, таких какпреобразование массива пара в 2D-массив на основе первого столбца

[[3,350],[4,800],[0,150],[0,200],[4,750]] 

во что-то вроде

[ 
    [150,200], 
    [], 
    [], 
    [350], 
    [800,750] 
] 

?

Другими словами, что является хорошим методом для размещения второго числа в каждой паре в массив, причем его индекс строки определяется первым числом в паре?

+1

Если список, который у вас есть, имеет отверстия (например, индекс 1 и 2 пустые), вы можете пересмотреть дизайн. Возможно, словарь будет хорошим выбором здесь – thefourtheye

ответ

0

Как @thefourtheye отметил dict может быть лучше контейнера. Если вам нужен 2D-список, вы можете сначала добавить значения промежуточный dict, где ключ - это строка и значение - список чисел. Тогда вы могли бы использовать список понимание для создания конечного результата:

>>> l = [[3,350],[4,800],[0,150],[0,200],[4,750]] 
>>> d = {} 
>>> for row, num in l: 
...  d.setdefault(row, []).append(num) 
... 
>>> [d.get(i, []) for i in range(max(d.keys()) + 1)] 
[[150, 200], [], [], [350], [800, 750]] 
0

я хотел бы использовать pandas модуль для выполнения этой задачи:

In [186]: a = np.array([[3,350],[4,800],[0,150],[0,200],[4,750]]) 

In [187]: res = pd.DataFrame(a).groupby(0)[1].apply(list).to_frame('val').rename_axis('idx') 

In [188]: res 
Out[188]: 
      val 
idx 
0 [150, 200] 
3   [350] 
4 [800, 750] 

Теперь вы установили индексированные данные, и вы можете использовать его в следующем путь:

In [190]: res.ix[0, 'val'] 
Out[190]: [150, 200] 

In [191]: res.ix[0, 'val'][1] 
Out[191]: 200 

In [192]: res.ix[4, 'val'] 
Out[192]: [800, 750] 

PS я думаю, что вы не должны держать пустые списки в результирующий набор данных - как это пустая трата ресурсов

1

Попробуйте взглянуть на списки, они обеспечивают однострочный способ создания списков. Если вы не знаете, что это такое, это довольно приличный справочник, чтобы вы начали here. Кроме того, взгляните на tuple, так как они более подходят для парных значений, в отличие от списков. Обратите внимание, что кортежи не изменяются, поэтому вы не можете вносить изменения после их создания.

Вашего список с помощью кортежей будут выглядеть следующим образом

foo = [(3,350),(4,800),(0,200),(4,750)] 

Насколько мне известно, списки Python не имеют предопределенного размера, а они увеличиваются и уменьшаются по мере внесения изменений. Итак, что вы хотите сделать, найти наибольшее значение индекса в списке, или foo = [x[0] for x in list_of_pairs] получит доступ к первому индексу каждого списка внутри вашего основного списка, который называется list_of_pairs. Обратите внимание, что эта стратегия будет работать и для списка tuple.

Ниже следует делать то, что вы хотите

list_of_pairs = [[3,350],[4,800],[0,200],[4,750]] 
indexes = {x[0] for x in list_of_pairs} 
new_list = [] 

for i in indexes: 
    new_list.append([x[1] for x in list_of_pairs if x[0] == i]) 
0

Есть numerious способов сделать это. Вот довольно прямолинейный:

a = [[3, 350], [4, 800], [0, 150], [0, 200], [4, 750]] 

rows, values = zip(*a) 
b = [[] for _ in range(max(rows)+1)] # initialize 2D output 
for i, row in enumerate(rows): 
    b[row].append(values[i]) 

print(b) # -> [[150, 200], [], [], [350], [800, 750]] 
+0

Пожалуйста, прочитайте [_Что делать, если кто-то отвечает на мой вопрос? _] (Http://stackoverflow.com/help/someone-answers) – martineau

Смежные вопросы