Pythonic方式操纵相同的字典

时间:2014-12-08 01:45:53

标签: python

一个非常幼稚的问题..我有以下功能:

def vectorize(pos, neg):
    vec = {item_id:1 for item_id in pos}
    for item_id in neg:
        vec[item_id] = 0
    return vec

实施例

>>> print vectorize([1, 2] [3, 200, 201, 202])
{1: 1, 2: 1, 3: 0, 200: 0, 201: 0, 202: 0}

我觉得,这在python中太冗长了..有更多的pythonic方法来做到这一点...... 基本上,我返回一个字典,如果它在pos(列表)中,其值为1,否则为0

4 个答案:

答案 0 :(得分:3)

我不是特别相信这是否更加pythonic ...也许更有效率?不知道,真的

pos = [1, 2, 3, 4]
neg = [5, 6, 7, 8]

def vectorize(pos, neg):
    vec = dict.fromkeys(pos, 1)
    vec.update(dict.fromkeys(neg, 0))
    return vec

print vectorize(pos, neg)

输出:

{1: 1, 2: 1, 3: 1, 4: 1, 5: 0, 6: 0, 7: 0, 8: 0}

但我也喜欢你的方式......只是在这里提出一个想法。

答案 1 :(得分:1)

我可能只是这样做:

def vectorize(pos, neg):
    vec = {}
    vec.update((item, 1) for item in pos)
    vec.update((item, 0) for item in neg)
    return vec

但你的代码也很好。

答案 2 :(得分:1)

您可以使用

vec = {item_id : 0 if item_id in neg else 1 for item_id in pos}

但请注意,如果item_id in neg是一个列表(而不是一个集合),则查找neg将无效。

更新:看到预期的输出后。

请注意,上述内容不会为neg中仅 的项目插入0。如果你也想这样,可以使用以下单行。

vec = dict([(item_id, 1) for item_id in pos] + [(item_id, 0) for item_id in neg])

如果您想避免创建两个临时列表,itertools.chain可以提供帮助。

from itertools import chain
vec = dict(chain(((item_id, 1) for item_id in pos), ((item_id, 0) for item_id in neg)))

答案 3 :(得分:1)

这将是Pythonic,意思是相对较短并且最大限度地利用语言的功能:

def vectorize(pos, neg):
    pos_set = set(pos)
    return {item_id: int(item_id in pos_set) for item_id in set(pos+neg)}

print vectorize([1, 2], [3, 200, 201, 202])