1个“pythonic”代码,它返回一个集合而不是列表

时间:2015-01-26 05:01:10

标签: python python-3.x set

我想做以下代码,除了整齐的1-liner:

terms_set = set([])
for term in terms: 
    if index.has_key(term): 
        terms_set.add(index[term])

有可能吗?必须返回一套。

5 个答案:

答案 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)])