在下面的陣列,我想選擇陣列a
子陣列時的ID是已知的從多維陣列選擇一個陣列
a=[['id123','ddf',1],['id456','ddf',1],['id789','ddf',1]]
我知道ID即id456,在此基礎上如何我從a
中選擇值['id456','ddf',1]
而不使用任何循環。
在下面的陣列,我想選擇陣列a
子陣列時的ID是已知的從多維陣列選擇一個陣列
a=[['id123','ddf',1],['id456','ddf',1],['id789','ddf',1]]
我知道ID即id456,在此基礎上如何我從a
中選擇值['id456','ddf',1]
而不使用任何循環。
>>> a = [['id123','ddf',1],['id456','ddf',1],['id789','ddf',1]]
>>> next(x for x in a if x[0] == 'id456')
['id456', 'ddf', 1]
但是,我會推薦使用字典來代替。
我認爲這應該工作...
filter(lambda x:x[0]=='id456',a)[0]
但在這種情況下,不會一本字典是一個更好的數據結構?
在完成之前,它仍會經歷整個列表。和imo一樣,你所說的字典將是一個更好的數據結構。 –
@ChristianWitts這可以在Python 3中使用'next'而不是'[0]'來高效工作,但是因爲它是我認爲效率低下的原因,並且與生成器表達式相比,lambda的使用使其變得很難看。 – jamylak
字典結構會工作得更好。
b = {'id123': ['ddf', 1], 'id456': ['dff', 1], 'id789': ['ddf', 1]}
print b['id123']
如果列表進行排序,你可以使用bisect
模塊:
>>> i = bisect.bisect_left(a, ['id456'])
>>> if i < len(a) and a[i][0]=='id456':
... print a[i]
...
['id456', 'ddf', 1]
您可以使用numpy.where()
做到這一點:
a = numpy.array(a)
row = numpy.where(a == 'id456')[0]
sub_array = a[row,:]
這將檢查與所需的元素ID並回報他們的索引。如示例所示,您可以使用這些索引從原始數組中獲取切片。
此代碼僅適用於給定ID有單行的情況,但可以進行修改。
希望這會有所幫助。
'不使用任何循環'。這是功課嗎? –
明確不是作業.. – Rajeev
你是什麼意思沒有循環?像在正常的循環?我的發電機表達式是否允許? – jamylak