2009-09-08 8 views
-1

Pardonnez l'ambiguïté du titre - je n'étais pas tout à fait sûr de savoir comment formuler ma question.Stockage efficace des données Python (Types de données abstraites?)

d'une chaîne:

blah = "There are three cats in the hat" 

et (je ne suis pas tout à fait sûr que la structure de données à utiliser pour cela) "userInfo":

cats -> ("tim", "1 infinite loop") 
three -> ("sally", "123 fake st") 
three -> ("tim", "1 infinite loop") 
three cats -> ("john", "123 fake st") 
four cats -> ("albert", "345 real road") 
dogs -> ("tim", "1 infinite loop") 
cats hat -> ("janet", NULL) 

La sortie appropriée devrait être:

tim (since 'cats' exists) 
sally (since 'three' exists) 
tim (since 'three' exists) 
john (since both 'three' and 'cats' exist) 
janet (since both 'cats' and 'hat' exist somewhere in the string blah) 

Je veux un moyen efficace de stocker ces données. Il y a une possibilité pour plusieurs 'trois' chaînes qui peuvent être appariées (à savoir, 150 personnes auront cette chaîne.) Dois-je juste avoir une liste avec toutes ces données et dupliquer les "clés"?

+1

Je suis confus quant à ce que vous êtes en train d'essayer de le faire ici. Pouvez-vous donner une explication concise en anglais de ce que votre algorithme et votre structure de données doivent faire? –

+0

Je crois que les chaînes sont automatiquement internées en python, donc ne vous inquiétez pas de dupliquer les clés. Pas que tu devrais de toute façon. 150 * quelques octets = squat diddly. – recursive

+2

On dirait que vous essayez de faire une sorte de règle de correspondance, non? Donc, en gros, vous avez une chaîne d'entrée, "bla". Et vous avez une série de règles de correspondance, où, pour chaque règle de correspondance, si chaque mot sur le côté gauche est contenu dans la chaîne, le nom (et l'adresse) sur la droite fait partie de la sortie. Est-ce correct? – jprete

Répondre

0

Je ne suis pas sûr de ce que vous essayez de faire exactement, mais peut-être vous cherchez quelque chose comme ceci:

userinfo = { 
    "tim": "1 infinite loop", 
    "sally": "123 fake st", 
    "john": "123 fake st", 
    "albert": "345 real road", 
    "janet": None 
} 

conditions = { 
    "cats": ["tim"], 
    "three": ["sally", "tim"], 
    "three cats": ["john"], 
    "four cats": ["albert"], 
    "dogs": ["tim"], 
    "cats hat": ["janet"] 
} 

for c in conditions: 
    if all_words_are_in_the_sentence(c): 
    for p in conditions[c]: 
     print p, "because of", c 
     print "additional info:", userinfo[p] 
+0

Pouvez-vous fournir l'implémentation de 'all_words_are_in_the_sentence'? –

+0

Cette mise en œuvre dépend de ce que l'OP veut vraiment faire là-bas, ce qui n'était pas vraiment clair pour moi à partir de la question initiale. Dans le cas le plus simple, cela pourrait être 'blah.find (c)! = -1'. Si tout doit être basé sur des mots, probablement les clés dict devraient déjà être divisées en mots comme 'frozenset ([" chats "," chapeau "])'. Ensuite, définir l'intersection pourrait être utilisé pour comparer avec 'set (blah.split())'. Ou une fonction comme "matches" dans votre réponse pourrait être utilisée. Cela dépend vraiment des données réelles quelle est la meilleure solution. – sth

1

Je n'ai pas la moindre idée de ce que vous essayez réellement à faire, mais si vous avez beaucoup de données, et que vous avez besoin de les stocker, et que vous devez y faire des recherches, une sorte de base de données avec des capacités d'indexation semble être la voie à suivre.

ZODB, CouchBD ou SQL est une question de goût. Je doute sérieusement que vous ayez besoin de vous soucier de l'efficacité de l'espace disque autant que de la vitesse de recherche et de recherche de toute façon.

+0

Hourra pour CouchDB! –

6

Quelque chose comme ça?

class Content(object): 
    def __init__(self, content, maps_to): 
     self.content= content.split() 
     self.maps_to = maps_to 
    def matches(self, words): 
     return all(c in words for c in self.content) 
    def __str__(self): 
     return "%s -> %r" % (" ".join(self.content), self.maps_to) 

rules = [ 
    Content('cats',("tim", "1 infinite loop")), 
    Content('three',("sally", "123 fake st")), 
    Content('three',("tim", "1 infinite loop")), 
    Content('three cats',("john", "123 fake st")), 
    Content('four cats',("albert", "345 real road")), 
    Content('dogs',("tim", "1 infinite loop")), 
    Content('cats hat', ("janet", None)), 
] 

blah = "There are three cats in the hat" 

for r in rules: 
    if r.matches(blah.split()): 
     print r 

Sortie

cats -> ('tim', '1 infinite loop') 
three -> ('sally', '123 fake st') 
three -> ('tim', '1 infinite loop') 
three cats -> ('john', '123 fake st') 
cats hat -> ('janet', None) 
Questions connexes