我想做以下代码,除了整齐的1-liner:
terms_set = set([])
for term in terms:
if index.has_key(term):
terms_set.add(index[term])
有可能吗?必须返回一套。
答案 0 :(得分:7)
您可以使用集合理解:
terms_set = {index[term] for term in terms if term in index}
请注意,key in dict
优先于dict.has_key
was deprecated in Python 2,而在{3}}中不可用。
答案 1 :(得分:2)
terms_set = set(index[term] for term in terms if index.has_key(term))
答案 2 :(得分:2)
所以看起来你希望term_set
包含index
(某些字典)中的所有值,只要它的'key> 在{{{ 1}}(有些可迭代)。关于两个集合,那个交叉点,至少是密钥,terms
,但是生成两个集合,我们实际上既不感兴趣(我们想要值,而不是键)。我们可以用set(terms) & set(index)
来消除其中一个(反之亦然,取决于哪一个更大(我们希望左侧更小)。
我们可以使用我们的好朋友set(terms).intersection(index)
来获取价值。
怎么样?
map
甚至:
term_set = map(index.get, set(terms).intersection(index))
(在python2.7中,您需要term_set = map(index.get, index.keys() & terms)
)
嗯...考虑一下,index.viewkeys()
可以返回一个默认值(即dict.get
),我们可以在事后(如果它发生)去掉它
None
其中包含 NO 中间集合(假设为python3,否则map应为term_set = set(map(index.get, terms))
term_set.discard(None)
)
虽然如果itertools.imap
可以作为索引中的值出现,您最终必须做一些单调乏味的事情:
None
这并不比接受的答案好。
答案 3 :(得分:1)
此?
set(index[t] for t in terms if t in index)
请注意,has_key
已弃用,请改用key in dict
。
答案 4 :(得分:0)
terms_set = set([index[term] for term in terms if index.has_key(term)])