Je cherche un moyen propre pour obtenir un ensemble (liste, matry, quoi que ce soit) des mots commençant par in c #, j'écrirais P> # code> à l'intérieur d'une chaîne donnée.
var hashtags = input
.Split (' ')
.Where (s => s[0] == '#')
.Select (s => s.Substring (1))
.Distinct ();
6 Réponses :
Je dirais
set(hashtags)
Tu m'as battu à 8 secondes
set([i[1:] for i in line.split() if i.startswith("#")])
+1 pour .startswith. Ici, cela n'a pas d'importance, mais il gère le cas des chaînes vides et se généralise bien à n'importe quelle longueur, et donc une bonne habitude d'entrer dans.
@gaearon: somestr.split () code> ne sera-t-il pas, il bande tout espacement supplémentaire.
'a'.split (' a ') code> sera.
@GAEARON: Cela peut renvoyer une liste vide si la chaîne est vide ou ne contient que des espaces blanche. Les chaînes de cette liste ne seront pas vides si .split () code> est appelé, mais peut être indiqué si un sépérateur explicite est donné et la chaîne contient deux de ceux sans rien d'autre entre les deux. Voir The Docs .
Une autre option est regex:
Bien, mais je voulais quelque chose de plus facilement lisible que les regextes.
La méthode code> (code> code> de Objets d'expression réguliers peut tous les obtenir à la fois:
avec @ Inspectorg4dget's Réponse , si vous ne voulez pas de duplicates, vous pouvez utiliser définies de compréhensions au lieu de compréhensions de la liste. Notez que {} code> Syntaxe pour les compréhensions définies travaille seulement à partir de Python 2.7.
Si vous travaillez avec des versions plus anciennes, la compréhension de la liste d'aliments ( [] code>) sur
définit code> fonction comme suggéré par @bertrand . P> p>
Exactement ce dont j'avais besoin. Merci.
Il y a une faute de frappe en mon nom: c'est inspectorg4dget. Vous avez un '5' au lieu d'un '4'
@ inspectorg4dget, désolé, n'a pas remarqué. Et j'ai appris que je devrais le lier.
Une chose à ajouter à cela, si quelqu'un travaille avec Instagram, etc. Les balises sont contenues dans une légende et n'ont pas nécessairement besoin d'espaces entre eux. IE la légende # # washington westcoasts # Floride code> évaluerait
[ 'washington # westcoasts # florida'] code> --------------- ------------------------------------------- Mon contournement:
{tag.strip ("#" ) Pour la balise dans tags.replace ('#', '#'). Split () si tag.startswith ("#")} code>
@duality: Merci, tandis que votre solution ne fonctionne pas directement, il y a une petite solution - alors ça marche {tag.strip ("#") pour la balise dans tags.replace (# '#'). Split () si tag.startswith ("#")} code>
Il y a quelques problèmes avec les réponses présentées ici.
{tag.strip ("#") pour tag in tags.split () si tag.startswith ("#")} p>
[i [1:] pour i in line.split () si j'établie ("#")] p> li> ol>
ne fonctionne pas si vous avez HASHTAG comme '# one # deux #' p>
2 J'avais vu plus de moyens d'extraire hashtag, mais j'ai trouvé non d'entre eux répondant sur tous les cas p> Alors j'ai écrit un petit python code pour gérer la plupart des cas. Cela fonctionne pour moi. P> re.comple (r "# (\ w +)") code> Travailler pour de nombreuses langues Unicode (même à l'aide de Re.unicode) P>
def get_hashtagslist(string):
ret = []
s=''
hashtag = False
for char in string:
if char=='#':
hashtag = True
if s:
ret.append(s)
s=''
continue
# take only the prefix of the hastag in case contain one of this chars (like on: '#happy,but i..' it will takes only 'happy' )
if hashtag and char in [' ','.',',','(',')',':','{','}'] and s:
ret.append(s)
s=''
hashtag=False
if hashtag:
s+=char
if s:
ret.append(s)
return set(ret)
Maintenant que vous avez ajouté
.Distit () code> - il doit-il être le même ordre que dans l'entrée ou peut-être être un ensemble non ordonné? Ce dernier est un moyen beaucoup plus facile et plus rapide de filtrer des doublons.
@delnan: L'ensemble non ordonné est bien.