簡體   English   中英

從列表在Python中構建字符串

[英]String building in python from lists

 [['Demo-Site', '10.227.209.139'], ['Demo-Site', '10.227.215.68'], 
['Demo-Site', '172.18.74.146'], ['Site', '10.152.114.65'], 
['Site', '10.227.211.244'], ['Demo-Site', '10.227.147.98'], 
 ['test', '172.18.74.146']]

如果第一個索引相同,如何將所有IP連接起來形成一個大字符串? 我要制作默認詞典嗎?

應該:

["Site", "10.227.211.244, 10.152.114.65"]

您可以使用普通的字典setdefault方法:

dic={}
for ele in lis:
    dic.setdefault(ele[0],[]).append(ele[1])
[[a,','.join(b)] for a,b in dic.items()]

在這里,使用基於defaultdict的解決方案:

In [1]: list_of_ips = [['Demo-Site', '10.227.209.139'], ['Demo-Site', '10.227.215.68'], 
   ...: ['Demo-Site', '172.18.74.146'], ['test', '10.152.114.65'], 
   ...: ['Site', '10.227.211.244'], ['Demo-Site', '10.227.147.98'], 
   ...:  ['test', '172.18.74.146']]

In [2]: from collections import defaultdict

In [3]: resp_dict = defaultdict(list)

In [4]: for item in list_of_ips:
   ...:     resp_dict[item[0]].append(item[1])
   ...:     

In [5]: result = [[key, ", ".join(resp_dict[key])] for key in resp_dict]

In [6]: result
Out[6]: 
[['test', '10.152.114.65, 172.18.74.146'],
 ['Site', '10.227.211.244'],
 ['Demo-Site', '10.227.209.139, 10.227.215.68, 172.18.74.146, 10.227.147.98']]

似乎您想根據每個子列表中的第一個元素對記錄進行分組 那就是groupby所做的。 但是有一個重要的准備步驟 ,即根據每個子列表中的第一個第一個元素對列表進行排序。 您可以使用已sorted功能並將itemgetter用作功能。

from operator import itemgetter
from itertools import groupby
result = []
my_list = [['Demo-Site', '10.227.209.139'], 
['Demo-Site', '10.227.215.68'], 
['Demo-Site', '172.18.74.146'], 
['Site', '10.152.114.65'], 
['Site', '10.227.211.244'], 
['Demo-Site', '10.227.147.98'], 
['test', '172.18.74.146']]

演示groupby

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

收益率:

Demo-Site
  ['Demo-Site', '10.227.209.139']
  ['Demo-Site', '10.227.215.68']
  ['Demo-Site', '172.18.74.146']
  ['Demo-Site', '10.227.147.98']
Site
  ['Site', '10.152.114.65']
  ['Site', '10.227.211.244']
test
  ['test', '172.18.74.146']

如您所見,數據按子列表中的第一個元素分組。 因此,您現在需要的是連接( .join )同一 “成員”的最后一個元素,然后將列表[<given group>, <members string>]附加到result列表。

>>> for g, data in groupby(sorted(my_list, key=itemgetter(0)), itemgetter(0)):
...     result.append([g, ', '.join(elt[1] for elt in data)])
... 
>>> result
[['Demo-Site', '10.227.209.139, 10.227.215.68, 172.18.74.146, 10.227.147.98'], ['Site', '10.152.114.65, 10.227.211.244'], ['test', '172.18.74.146']]

您可以使用字典(和dict.setdefault方法)來基於第一個索引保留您的項目,然后將這些值結合起來:

>>> li=[['Demo-Site', '10.227.209.139'], ['Demo-Site', '10.227.215.68'], 
... ['Demo-Site', '172.18.74.146'], ['Site', '10.152.114.65'], 
... ['Site', '10.227.211.244'], ['Demo-Site', '10.227.147.98'], 
...  ['test', '172.18.74.146']]
>>> 
>>> d={}
>>> 
>>> for i,j in li:
...   d.setdefault(i,[]).append(j)
... 
>>> [[i,','.join(j)] for i,j in d.items()]
[['test', '172.18.74.146'], ['Site', '10.152.114.65,10.227.211.244'], ['Demo-Site', '10.227.209.139,10.227.215.68,172.18.74.146,10.227.147.98']]
>>> 

或者,正如您提到的,使用defaultdict:

from collections import defaultdict

lst = [['Demo-Site', '10.227.209.139'], ['Demo-Site', '10.227.215.68'], 
['Demo-Site', '172.18.74.146'], ['Site', '10.152.114.65'], 
['Site', '10.227.211.244'], ['Demo-Site', '10.227.147.98'], 
 ['test', '172.18.74.146']]

dct = defaultdict(list)

for name, ip in lst:
    dct[name].append(ip)

res = [ [name, ', '.join(ips)] for name, ips in dct.items() ]
print(res)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM