2014-07-01 127 views
0

我有列表分组在Python列表的列表中的特定元素

List = [['ServerA','Envname1','abc','xyz'], 
     ['ServerA','Envname2','abc','xyz'], 
     ['ServerB','Envname3','aaa','bbb'], 
     ['ServerC','EnvName4','uuu','vvv'], 
     ['ServerB','Envname5','aaa','bbb']] 

列表如果该服务器是相同的,然后在第二和内列出的第三索引的值将是相同的。

例如: - 在第一个列表['ServerA','Envname1','abc','xyz']和第二个列表['ServerA','Envname2','abc','xyz']服务器是相同的('ServerA'),所以值'abc'和'xyz'是相同的。

同样地,在第三值服务器B和4日是相同的“AAA”和“BBB”

只有ENVNAME正在发生变化,即使服务器是一样的。

我在列表的最终列表中想要的是将所有具有相同名称的服务器进行分组,并相应地添加所有Envnames,如果服务器名称相同,其余元素将相同。

预期列表

Final_list = [['ServerA','Envname1,Envname2','abc','xyz'], 
       ['ServerB','Envname3,Envname5','aaa','bbb'], 
       ['ServerC','EnvName4','uuu','vvv']] 

可有人告诉我这个?

回答

2

这应该工作:

l = [['ServerA','Envname1','abc','xyz'], 
    ['ServerA','Envname2','abc','xyz'], 
    ['ServerB','Envname3','aaa','bbb'], 
    ['ServerC','EnvName4','uuu','vvv'], 
    ['ServerB','Envname5','aaa','bbb'], 
    ] 

d = {} 
for item in l: 
    key = (item[0], item[2], item[3]) 
    env = d.setdefault(key, []) 
    env.append(item[1]) 

final_list = [[k[0], ",".join(v), k[1], k[2]] for k, v in d.items()] 
print final_list 

输出:

[['ServerA', 'Envname1,Envname2', 'abc', 'xyz'], 
['ServerB', 'Envname3,Envname5', 'aaa', 'bbb'], 
['ServerC', 'EnvName4', 'uuu', 'vvv'], 
] 
+0

辉煌!谢谢 :) –

0
from itertools import groupby,chain 
from operator import itemgetter 
List_server = [['ServerA','Envname1','abc','xyz'], 
     ['ServerA','Envname2','abc','xyz'], 
     ['ServerB','Envname3','aaa','bbb'], 
     ['ServerC','EnvName4','uuu','vvv'], 
     ['ServerB','Envname5','aaa','bbb']] 

List_server=sorted(List,key=lambda x:x[0][-1]) 
print [set(chain(*list(g))) for i,g in groupby(List_server,key=itemgetter(0))] 

output: [set(['xyz', 'abc', 'ServerA', 'Envname2', 'Envname1']), 
     set(['Envname5', 'aaa', 'bbb', 'ServerB', 'Envname3']), 
     set(['EnvName4', 'uuu', 'vvv', 'ServerC'])] 

explantion:

  1. 首先排序根据服务器List_server=sorted(List,key=lambda x:x[0][-1])
  2. 使用key=itemgetter(0)

注意执行GROUPBY列表:不要使用Python的关键词作为变量

+0

的任择议定书要求的ENV名用逗号连接起来。您也不保留子列表的排序,这可能很重要。 –

相关问题