2016-11-04 97 views
-2

我觉得这可以在一行中完成,但我找不到办法。这可以在python中的一行中完成吗?

# final_list is what I want as an output 
final_list = [] 

for x in some_list: 
    # y is a dictionary 
    y = x.get_some_dict() 

    # Want to add a new key/value pair to y, which comes from x 
    y.update({"new_key": x.property_in_x}) 
    # append y to the output list 
    final_list.append(y) 

return final_list 
+3

我认为更好的问题是为什么你要完全取好的代码并将其塞进一个可能不可读的行中。 – csmckelvey

+1

由于'dict.update'这样做会在一行中做到这一点很棘手,并且如上所述可能不太容易理解 – jonrsharpe

+1

不要陷入思考一个线程为更好的代码所思考的陷阱。这段代码非常好,没有理由被塞进一行。 –

回答

2

我不会推荐将其折叠为一行列表理解。它可以完成,但它是不好的风格。列表解析不应有副作用(即呼叫update)。

您可以使用生成器替换显式列表追加。这不是一个坏主意。而d[k] = vd.update({k: v})简单。

def final_list(some_list): 
    for x in some_list: 
     y = x.get_some_dict() 
     y["new_key"] = x.property_in_x 
     yield y 
+0

Upvoted因为您给OP“正确的答案”。 _他的代码不应该被压缩成一行。 –

0

下面是等价列表理解表达沿着环路:

final_list = [x.get_some_dict() for x in some_list] 
for dict_item, base_item in zip(final_list, some_list): 
    dict_item["new_key"] = base_item.property_in_x 
+0

等效,只是结果是一个完整的'None's – jonrsharpe

+0

@jonrsharpe:我感觉真的很愚蠢。大SORRY!更新它 –

0

我不会推荐它的阻尼成一个衬垫,这将(可能)是混乱和不可读。另外,update会对单线解决方案造成问题。

但是,在我看来,这可以简化,更清晰: (缩短,而不是不可读的一个衬垫)

for x in some_list: 
    x.get_some_dict().update({"new_key": x.property_in_x}) 
final_list = [y.get_some_dict() for y in some_list] 
+1

如果'x.get_some_dict()'每次调用时都返回'dict'类型的新对象会怎么样? –

+0

@anonymous好点。但如果是这样,应该提到 –

+0

我的看法与此相反。如果是这样,那就应该提到。当创建像'x.get_some_dict()'这样的函数时,我几乎不会从这里返回类的属性。 –