2012-06-04 4 views
1

В следующем массиве, я хочу выбрать суб-массив из массива a, когда идентификатор известенВыберите массив из многомерного массива

a=[['id123','ddf',1],['id456','ddf',1],['id789','ddf',1]] 

Я знаю, что ИЭ ID, id456, основываясь на этом, как можно Я выбираю значения ['id456','ddf',1] от a без использования каких-либо циклов.

+0

'без использования каких-либо циклов'. Это домашнее задание? –

+0

окончательно не домашнее задание .. – Rajeev

+0

Что вы подразумеваете под петлей? Как в норме для цикла? Являются ли генераторные выражения, подобные моим? – jamylak

ответ

2
>>> a = [['id123','ddf',1],['id456','ddf',1],['id789','ddf',1]] 
>>> next(x for x in a if x[0] == 'id456') 
['id456', 'ddf', 1] 

Я бы рекомендовал вместо этого использовать словарь.

1

Я думаю, что это должно работать ...

filter(lambda x:x[0]=='id456',a)[0] 

Но в данном случае, не словарь будет лучше структуры данных?

+1

Это все равно будет проходить весь список до его завершения. Имо, словарь, как вы заявили, будет лучшей структурой данных для использования. –

+0

@ChristianWitts Это может эффективно работать в Python 3 с использованием 'next' вместо' [0] ', но, поскольку я согласен с тем, что это неэффективно, а использование лямбда делает его уродливым по сравнению с выражением генератора. – jamylak

0

Структура словаря будет работать намного лучше.

b = {'id123': ['ddf', 1], 'id456': ['dff', 1], 'id789': ['ddf', 1]} 
print b['id123'] 
0

Если список отсортирован, вы можете использовать bisect модуль:

>>> i = bisect.bisect_left(a, ['id456']) 
>>> if i < len(a) and a[i][0]=='id456': 
...  print a[i] 
... 
['id456', 'ddf', 1] 
0

Вы можете использовать numpy.where() сделать:

a = numpy.array(a) 

row = numpy.where(a == 'id456')[0] 

sub_array = a[row,:] 

Это будет проверять элементы с желаемым id и вернуть индексы. Вы можете использовать эти индексы для получения фрагментов из исходного массива, как показывает пример.

Этот код будет работать только в том случае, если для данного идентификатора имеется одна строка, но его можно адаптировать.

Надеюсь, это поможет.

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