2017-04-04 2 views
2

Vor meiner Forderung zu erklären, lassen Sie mich erklären, was ich nicht will:herausfinden: In wie viel Wort ein Zeichen in einem gegebenen Satz: PYTHON

s= 'Hello satya, have you achieved your goal' 
s.count('l') #o/p: 3 
#I don't want 3 instead I need 2. How? explained below. 

Erwartete Ausgabe:

{'H':3, 'e':3, 'l':2, 'o':4, 's':1, 'a':3....etc} 

Das heißt: nehmen Sie alle eindeutigen Buchstaben/Zeichen aus diesem Satz. Dann finden Sie "in wie vielen Wörtern dieses Zeichen vorhanden ist", so zählen Sie, dass keine Vorkommen und im Wörterbuch speichern.

Zum Beispiel ist das Zeichen 'l' 3 mal in diesem Satz vorhanden, aber in 2 WORDS (in hallo wird es wiederholt, aber ich möchte, dass es als 1 gezählt wird).

Bitte vorschlagen. Wenn ich etwas verpasst habe, um mein Problem verständlicher zu machen, markieren Sie bitte.

Hier ist, was ich versucht:

def char_word(s): 
    s_d = {} 
    chars = list(s.replace(' ', '')) 
    print(chars) 
    for char in chars: 
     c_count = 0 
     for word in s.split(): 
      if char in word: 
       c_count += 1 
      s_d[char] = c_count 
    print(s_d) 
    return s_d 
+0

Wie üblich, was hast du versucht dein problem zu lösen? – Julien

+0

hat meine Studie in Frage gestellt. Ich weiß nicht, ob es pythonischer Weg ist. – Satya

Antwort

1

Zuerst teilen Sie die Zeichenfolge in einzelne Wörter und erstellen Sie das Ausgabewörterbuch. Ich empfehle, mit dem collections.Counter c.ass, die nur entworfen dict Unterklasse ist Vorkommen zu zählen:

import collections 
counter = collections.Counter() 
words = s.split() 

Jetzt Schleife durch alle Worte und ein set von jedem Wort erstellen. Da set keine doppelten Werte haben kann, ist es garantiert genau eine Kopie der einzelnen Zeichen haben:

for word in words: 
    characters = set(word) 

Und schließlich Schleife durch die nun eindeutige Zeichen des Wortes, der Wert des Zählers erhöht wird für dieses Zeichen:

for character in characters: 
     counter[character] += 1 

auch können Sie verkürzen diese ziemlich viel, sogar bis zu einem Einzeiler:

>>> counter = collections.Counter(c for word in s.split() for c in set(word)) 

um mit der Zählung eines bestimmten Charakter zu bekommen, jus t Zugang es durch counter[c]:

>>> counter['l'] 
2 
>>> counter['x'] 
0 
>>> counter['H'] 
1 
+0

@ Markus-hat den One Liner für Sie gearbeitet, weil ich bekomme "NameError: Name 'Wort' ist nicht definiert" – Satya

+0

@Satya Fixed. Ich habe versehentlich einen früheren Prototyp eingefügt. –

+0

@ markus-Ich bevorzuge char_dict = dict (Zähler). Danke für den OneLiner. Arbeitete für mich. Als Antwort angenommen. – Satya

1

Sie tun können

sum(['l' in i for i in s.split()]) 

s.split() teilt Ihren Satz in Worte zu fassen (es spaltet von ). Dann prüft die for-Schleife, ob das Zeichen l in diesem bestimmten Wort ist, was True oder False ergibt, wenn es das ist oder nicht. Die sum Funktion zählt alle True s

+0

Dies führt jedoch nicht zum gewünschten Ausgabewörterbuch. –

1

Sie können es auch innerhalb groupby von itertools Modul und dict comprenesion wie auf diese Weise:

from itertools import groupby 

a = 'Hello satya, have you achieved your goal' 
a = a.replace(',','').split() 
sub = [j.lower() for k in a for j in set(k)] 
final = {k:len(list(v)) for k,v in groupby(sorted(sub), lambda x: x)} 
print(final) 

outut:

{'h': 3, 'u': 2, 's': 1, 'i': 1, 'c': 1, 'a': 4, 'd': 1, 'e': 3, 't': 1, 'v': 2, 'l': 2, 'o': 4, 'r': 1, 'g': 1, 'y': 3} 
Verwandte Themen