Dan*_*mov 7 python string list-comprehension hashtag
我正在寻找一种干净的方法来获取一个#以给定字符串开头的单词集(列表,数组,等等).
在C#中,我会写
var hashtags = input
.Split (' ')
.Where (s => s[0] == '#')
.Select (s => s.Substring (1))
.Distinct ();
Run Code Online (Sandbox Code Playgroud)
在Python中执行此操作的相对优雅的代码是什么?
编辑
样本输入:"Hey guys! #stackoverflow really #rocks #rocks #announcement"
预期输出:["stackoverflow", "rocks", "announcement"]
utd*_*mir 19
使用@ inspectorG4dget的答案,如果您不需要重复项,则可以使用set comprehensions而不是list comprehensions.
>>> tags="Hey guys! #stackoverflow really #rocks #rocks #announcement"
>>> {tag.strip("#") for tag in tags.split() if tag.startswith("#")}
set(['announcement', 'rocks', 'stackoverflow'])
Run Code Online (Sandbox Code Playgroud)
请注意,{ }set comprehensions的语法仅适用于Python 2.7.
如果您正在使用旧版本,请按照@Bertrand的建议[ ]将Feed list comprehension()输出设置为set函数.
ins*_*get 15
[i[1:] for i in line.split() if i.startswith("#")]
Run Code Online (Sandbox Code Playgroud)
这个版本将摆脱任何空字符串(因为我已经在评论中阅读了这些问题)和字符串"#".此外,与Bertrand Marron的代码一样,最好将其转换为如下集合(以避免重复和O(1)查找时间):
set([i[1:] for i in line.split() if i.startswith("#")])
Run Code Online (Sandbox Code Playgroud)
正则表达式对象的findall方法可以一次性获取它们:
>>> import re
>>> s = "this #is a #string with several #hashtags"
>>> pat = re.compile(r"#(\w+)")
>>> pat.findall(s)
['is', 'string', 'hashtags']
>>>
Run Code Online (Sandbox Code Playgroud)
我会说
hashtags = [word[1:] for word in input.split() if word[0] == '#']
Run Code Online (Sandbox Code Playgroud)
编辑:这将创建一个没有任何重复的集合.
set(hashtags)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20757 次 |
| 最近记录: |