2014-07-01 198 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名用逗號連接起來。您也不保留子列表的排序,這可能很重要。 –

相關問題