分配给单行中的列表的项目以进行循环



我想将分配给单行中的列表中的项目。

首先,我有一个列表,其中每个列表项目都是字典对象。然后,我要在列表的每个项目上进行循环,并比较字典的" nodeid"字段是否为106。如果是,则在该字典中添加新字段。代码在下面。

K= []
K.append({'nodeid': 100 ,'elemid': 200})
K.append({'nodeid': 106 ,'elemid': 206})
K.append({'nodeid': 107 ,'elemid': 206})
for item in K: 
   if item['nodeid']==106: 
     item['S']= [2 , 124, 123 , 3532, 35]

我想在单行中写入算法的循环部分

[item['S']=12343 for item in K if item['nodeid']==106]

但是,此方法不起作用。如何在一行中写入此循环?

谢谢

正如我在评论中所说的那样,为此任务编写单线并不是要走的方法,因为您丢失的可读性量是 massive 。P>

,如果是出于纯好奇心,您可以这样做:

K = [x if x['nodeid'] != 106 else dict(x, **{'S': [2 , 124, 123 , 3532, 35]}) for x in K]

魔术发生在dict(x, **{'S': [2 , 124, 123 , 3532, 35]})中,这实质上将两个dict离子添加在一起并返回其结果。

python 3.5

K = [{**d, 'S': [2 , 124, 123 , 3532, 35]} if d['nodeid'] == 106 else d for d in K]

如果您愿意,当然可以这样做,这样的方式:

K = []
K.append({'nodeid': 100 ,'elemid': 200})
K.append({'nodeid': 106 ,'elemid': 206})
K.append({'nodeid': 107 ,'elemid': 206})
K = [item if item['nodeid'] != 106 else dict(S=[2 , 124, 123 , 3532, 35], **item) for item in K]

**是python的"爆炸"或打开包装运算符的版本,在此处详细描述的字典上使用。


但是,考虑到nodeid,您的数据似乎已经在字典中了,所以为什么不这样重组呢?

K = {}
K[100] = {'elemid': 200}
K[106] = {'elemid': 206}
K[107] = {'elemid': 206}
K[106]['S'] = [2 , 124, 123 , 3532, 35]

这是使用哈希/表数据结构的好处:快速,方便(更不用说,可读)索引。每个元素的位置已经知道,除非您有次要密钥标准,否则您不需要在包含的元素上进行任何形式的迭代。

此外,通过使用字典,您可以避免重建整个列表的成本,这是通过在给出的第一个示例中使用列表理解发生的。但是请注意,如果您使用的是您最初的for循环,您将不会遇到这个问题,因为这只会改变元素一旦找到,并且如果您完成操作后break,则循环将完成而不会产生任何额外费用。/p>

如果您有很多项目,则写单线意味着重建整个列表,如果您要更改稀疏值,这并不有效。

单行(与所有版本的Python> = 2.7一起使用):

K = [d if d['nodeid']!=106 else {k:v for k,v in list(d.items())+[('S',[2 , 124, 123 , 3532, 35])]} for d in K]

如果ID不匹配,请发行Sublist,否则使用Sublist Extra Element构建字典(不使用所有Python版本没有的花式"词典添加")

最新更新