一个非常幼稚的问题..我有以下功能:
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
答案 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])