2012-03-29 3 views
0

Ich versuche, den Unterschied zwischen 2 Container zu bekommen, aber die Container sind in einer seltsamen Struktur, so weiß ich nicht, was der beste Weg ist, um einen Unterschied zu machen. Ein Container Typ und Struktur kann ich nicht ändern, aber die anderen kann ich (variable delims).Führen Sie den Unterschied zwischen den Operationen auf einer Liste von Tupeln

delims = ['on','with','to','and','in','the','from','or'] 
words = collections.Counter(s.split()).most_common() 
# words results in [("the",2), ("a",9), ("diplomacy", 1)] 

#I want to perform a 'difference' operation on words to remove all the delims words 
descriptive_words = set(words) - set(delims) 

# because of the unqiue structure of words(list of tuples) its hard to perform a difference 
# on it. What would be the best way to perform a difference? Maybe... 

delims = [('on',0),('with',0),('to',0),('and',0),('in',0),('the',0),('from',0),('or',0)] 
words = collections.Counter(s.split()).most_common() 
descriptive_words = set(words) - set(delims) 

# Or maybe 
words = collections.Counter(s.split()).most_common() 
n_words = [] 
for w in words: 
    n_words.append(w[0]) 
delims = ['on','with','to','and','in','the','from','or'] 
descriptive_words = set(n_words) - set(delims) 

Antwort

3

Wie wäre es, nur words durch Entfernen aller Begrenzer zu ändern?

words = collections.Counter(s.split()) 
for delim in delims: 
    del words[delim] 
+0

das sieht effizient aus Ich denke, ich werde es verwenden, aber Wörter sind eine Liste von Tupeln Wie kann ich "words [delim]" sagen? –

+0

@JakeM - wenden Sie es direkt auf das Counter-Objekt an. – eumiro

+0

Ah, ich dachte, Wörter war das Counter-Objekt –

1

Das habe ich, wie ich es tun würde:

delims = set(['on','with','to','and','in','the','from','or']) 
# ... 
descriptive_words = filter(lamdba x: x[0] not in delims, words) 

die Filtermethode verwenden. Eine brauchbare Alternative wäre:

delims = set(['on','with','to','and','in','the','from','or']) 
# ... 
decsriptive_words = [ (word, count) for word,count in words if word not in delims ] 

Sicherzustellen, dass die delims in einem Satz sind für O(1) lookup zu ermöglichen.

+0

Die erste Methode verwendet 'in', bedeutet das, dass wir bei jedem Vergleich über die gesamte delim-Methode iterieren? –

+0

nicht, wenn sie ein Set oder Diktat sind. O (1) lookup, [die Dokumente sagen] (http://wiki.python.org/moin/TimeComplexity). – brice

0

Wenn Sie trotzdem durchgehen, warum sollten Sie sie in Sets umwandeln?

dwords = [delim[0] for delim in delims] 
words = [word for word in words if word[0] not in dwords] 
+0

@Rob Young ja Ich versuche zu vermeiden, über sie für die Effizienz zu iterieren. Jede Lösung, die nicht iteriert, ist am besten, denke ich –

+0

Schlechte Idee. Es wäre O (n^2), oder? – brice

0

Für Leistung können Sie Lambda Funktionen

filter(lambda word: word[0] not in delim, words) 
+0

Filter + Lambda ist weniger lesbar als ein Listenverständnis, und das Listenverständnis kann [oft schneller] sein (http://wiki.python.org/moin/PythonSpeed/PerformanceTips#) Schleifen). –

+0

Zweitens macht dies immer noch O (n^2), da delims eine Liste ist. – brice

1

Die einfachste Antwort ist zu tun, verwenden:

import collections 

s = "the a a a a the a a a a a diplomacy" 
delims = {'on','with','to','and','in','the','from','or'} 
// For older versions of python without set literals: 
// delims = set(['on','with','to','and','in','the','from','or']) 
words = collections.Counter(s.split()) 

not_delims = {key: value for (key, value) in words.items() if key not in delims} 
// For older versions of python without dict comprehensions: 
// not_delims = dict(((key, value) for (key, value) in words.items() if key not in delims)) 

Was gibt uns:

{'a': 9, 'diplomacy': 1} 

Eine alternative Möglichkeit ist es, präventiv zu tun:

import collections 

s = "the a a a a the a a a a a diplomacy" 
delims = {'on','with','to','and','in','the','from','or'} 
counted_words = collections.Counter((word for word in s.split() if word not in delims)) 

Hier können Sie die Filterung auf der Liste der Wörter anwenden, bevor Sie es an den Zähler geben, und das gibt das gleiche Ergebnis.

Verwandte Themen