通过组python组合多维数组

时间:2015-08-18 16:18:49

标签: python list dictionary

 [['test', '172.18.74.146', '13:05:43.834', '2015_08_07'], 
  ['test', '172.18.74.148', '12:27:39.016', '2015_08_07'], 
 ['blah', '172.18.74.149', '11:18:33.846', '2015_08_12'], 
 ['blah', '172.18.74.146', '12:27:38.985', '2015_08_12']]

我希望最终结果按日期和项目名称分组

[["test", "172.18.74.146, 172.18.74.148", "13:05:43.834, 12:27:39.016" ,
"2015_08_07"], etc..]

给定日期的名称将不相同。

我该怎么做?我尝试过使用groupby。

for g, data in groupby(sorted(my_list, key=itemgetter(0)), itemgetter(0)):
   print(g)
   for elt in data:
     print(' ', elt)

但它并没有给我我想要的东西。

1 个答案:

答案 0 :(得分:3)

你需要传递两个键来排序,名称和日期,然后使用str.join来连接ip和时间

from itertools import groupby
from operator import itemgetter

out = []

for _, v in groupby(sorted(data, key=itemgetter(0, 3)),key=itemgetter(0,3)):
    v = list(v)    
    ips = ", ".join([sub[1] for sub in v])
    tmes = ", ".join([sub[2] for sub in v])
    out.append([v[0][0], ips, tmes, v[0][-1]])

print(out)

['blah', '172.18.74.149, 172.18.74.146', '11:18:33.846, 12:27:38.985', '2015_08_12'], 
['test', '172.18.74.146, 172.18.74.148', '13:05:43.834, 12:27:39.016', '2015_08_07']]

或者没有使用dict进行排序分组:

d = {}

for nm, ip, tm, dte in data:
    key = nm, dte
    if key in d:
        v = d[key]
        v[1] += ", {}".format(ip)
        v[2] += ", {}".format(dte)
    else:
        d[key] = [nm, ip, tm, dte]

print(list(d.values()))

输出:

[['test', '172.18.74.146, 172.18.74.148', '13:05:43.834, 2015_08_07', '2015_08_07'], 
['blah', '172.18.74.149, 172.18.74.146', '11:18:33.846, 2015_08_12', '2015_08_12']]