1

私の問題は、何かの名前を配列に追加したいということです。多次元配列の追加と検索

test_array = [] 
test_array.append(['apples', 2]) 
test_array.append(['oranges', 5]) 
test_array.append(['bananas', 1]) 

print(*test_array) 

['apples', 2] 
['oranges', 5] 
['bananas', 1] 

今、私は追加する前にアイテムが存在するかどうかをテストだろう、私は数えていますものの名前で私の2次元配列を検索し、第二のカラム

test_array['oranges'][1] = test_array['oranges'][1]+1 

に1を追加したいと思います第二カラム

if test_array['string'] != None: 
    test_array.append['string', ] 

から1私はこれが可能であるかどうかわからないですか、私は、リストに追加する前に、アイテムの配列の全体の最初の列を検索する必要があります場合。私は37,731,481個のアイテムについてこれをやろうとしていますので、実行時に二次的ではない文字列を検索する方法が必要なので、おそらく文字列でリストをソートしてバイナリ検索を行います。

+0

追加する前に配列の最初の列全体を検索する必要があると思います。あなたのユースケースでは、辞書が優れたデータ構造になると思われますか?https://docs.python.org/3/tutorial/datastructures.html#dictionaries –

答えて

1

ネストされたリストの代わりにマッピングを使用することをお勧めします。最も好ましくはcollections.Counterオブジェクトです。アイテムはキーになり、カウントは値になります。次に、一定時間内に鍵を検索することができます。O(1)。

from collections import Counter 

dct = Counter() 
dct['apples'] = 2 
dct['oranges'] = 5 
dct['bananas'] = 1 
print dct 
# Counter({'oranges': 5, 'apples': 2, 'bananas': 1}) 

そして、あなたは/更新値を追加するために重要な存在をテストする必要はありません。

# updating a key (which is not in the counter) 
dct['mango'] += 3 
print dct 
# Counter({'oranges': 5, 'apples': 2, 'mango': 3, 'bananas': 1}) 

バニラdictsとは異なりcollections.Counterオブジェクトは常に不足しているキーのゼロを返すのではなく高めるため、これがそうですKeyError

負の数を管理する必要がある場合は、Counterオブジェクトが最適な選択肢にはなりません。

from collections import defaultdict: 

dct = defaultdict(int) 
... 

が負の数が正しく処理されている以外Counterと同じように動作します:あなたは代わりにdefault_factoryint機能させるcollections.defaultdictオブジェクトを使用することができます。

関連する問題