以单行for循环为列表项分配

时间:2017-12-22 14:46:18

标签: python list for-loop variable-assignment

我想在一行中为一个列表中的项目进行赋值循环。

首先我有一个列表,其中每个列表项都是字典对象。然后,我做了循环列表中的每个项目并比较是否' 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]

但此方法不起作用。 我怎么能用一行写这个循环?

感谢

4 个答案:

答案 0 :(得分:1)

正如我在评论中所说的那样,为这项任务写一个单行是不可能的,因为你失去的可读性是大量的

但是,如果出于纯粹的好奇心,你可以这样做:

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个离子加在一起并返回其结果。

答案 1 :(得分:1)

Python 3.5 +

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

答案 2 :(得分:1)

如果你愿意的话,你当然可以这样做:

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的“爆炸”或解包运算符的版本,在字典上使用,详细描述over here

然而,考虑到nodeid,您的数据看起来好像已经在字典中了,那么为什么不重新调整它呢?

K = {}
K[100] = {'elemid': 200}
K[106] = {'elemid': 206}
K[107] = {'elemid': 206}

K[106]['S'] = [2 , 124, 123 , 3532, 35]

这是使用散列/表数据结构的好处:快速方便(更不用说,可读)索引。每个元素的位置都是已知的,除非您有二级键标准,否则不需要对包含的元素进行任何迭代。

此外,通过使用词典,您可以避免重建整个列表的成本,这通过在给定的第一个示例中使用列表推导来实现。但是请注意,如果您使用了开头的for循环,则不会出现此问题,因为只有在找到元素后才会更改元素,如果在完成操作后break,则循环将会完成后不会产生任何额外费用。

答案 3 :(得分:0)

如果你有很多项目,写一个单行意味着重建整个列表,如果你有稀疏的值要改变,那就没有效率。

单行(适用于所有版本的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不匹配,发出子列表,否则用子列表+额外元素构建一个字典(不使用所有python版本都没有的花哨的“字典添加”)