我想在一行中为一个列表中的项目进行赋值循环。
首先我有一个列表,其中每个列表项都是字典对象。然后,我做了循环列表中的每个项目并比较是否' 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]
但此方法不起作用。 我怎么能用一行写这个循环?
感谢
答案 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版本都没有的花哨的“字典添加”)