1

Donc, mon problème est que je veux ajouter un nom de quelque chose à un tableau, et un nombre.Ajout et recherche dans un tableau multidimensionnel

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] 

Maintenant, je voudrais chercher mon tableau 2d par le nom de la chose je compte et ajouter 1 à la deuxième colonne

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

Je tester l'existence de l'élément avant d'ajouter 1 à la deuxième colonne

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

Je ne sais pas si cela est possible, ou si je vais juste besoin de rechercher toute la première colonne du tableau de l'élément avant d'ajouter à la liste. Je vais le faire pour 37 731 481 éléments, donc j'aurais besoin d'un moyen de rechercher des chaînes qui ne seraient pas quadratiques dans l'exécution, donc je trierais probablement ma liste par les chaînes et ferais une recherche binaire.

+0

Je pense que vous devrez rechercher toute la première colonne du tableau avant de l'ajouter. Il semble qu'un dictionnaire serait peut-être une meilleure structure de données pour votre cas d'utilisation?: Https://docs.python.org/3/tutorial/datastructures.html#dictionaries –

Répondre

1

Je vous suggère d'utiliser un mappage à la place des listes imbriquées, le plus préférablement un objet collections.Counter. Les éléments seront les clés et leurs comptes seront des valeurs. Ensuite, la recherche d'une clé peut être effectuée à temps constant - 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}) 

Et vous aurez pas besoin de tester l'existence clé pour ajouter/valeurs de mise à jour:

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

Il en est ainsi parce que collections.Counter objets contrairement à dicts de vanille reviennent toujours zéro pour les clés manquantes plutôt que de soulever un KeyError.

Si vous devez gérer des nombres négatifs, un objet Counter ne sera pas le meilleur choix. Vous pouvez utiliser un objet collections.defaultdict plutôt faire la default_factory la fonction int:

from collections import defaultdict: 

dct = defaultdict(int) 
... 

fonctionne de la même manière que le Counter sauf comptes négatifs sont correctement traités.