2012-06-04 117 views
1

在下面的陣列,我想選擇陣列a子陣列時的ID是已知的從多維陣列選擇一個陣列

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

我知道ID即id456,在此基礎上如何我從a中選擇值['id456','ddf',1]而不使用任何循環。

+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

在完成之前,它仍會經歷整個列表。和imo一樣,你所說的字典將是一個更好的數據結構。 –

+0

@ChristianWitts這可以在Python 3中使用'next'而不是'[0]'來高效工作,但是因爲它是我認爲效率低下的原因,並且與生成器表達式相比,lambda的使用使其變得很難看。 – 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並回報他們的索引。如示例所示,您可以使用這些索引從原始數組中獲取切片。

此代碼僅適用於給定ID有單行的情況,但可以進行修改。

希望這會有所幫助。