2014-09-21 52 views
1

我寫的Python代碼,並得到這樣的列表:如何連接列表以獲取帶有端口的IP地址?

['221.180.147.30', '86', '61.155.169.11', '808']

我怎樣才能把它轉化爲:

['221.180.147.30:86', '61.155.169.11:808']

+0

'[ ':' 加入(F [0:2]), ':'。加入(F [2:4])]' – 2014-09-21 04:15:29

回答

1

使用列表理解:

>>> lst = ['221.180.147.30', '86', '61.155.169.11', '808'] 
>>> [':'.join(lst[i:i+2]) for i in range(0, len(lst), 2)] 
['221.180.147.30:86', '61.155.169.11:808'] 

使用zip(*[iter(lst)*N]訣竅介紹於itertools recipe - grouper(此作品爲fo [R可迭代的,不僅是對列表):

>>> [':'.join(group) for group in zip(*[iter(lst)]*2)] 
['221.180.147.30:86', '61.155.169.11:808'] 

UPDATE

使用map

>>> map(':'.join, zip(lst[::2], lst[1::2])) # In Python 2.x 
['221.180.147.30:86', '61.155.169.11:808'] 
>>> list(map(':'.join, zip(lst[::2], lst[1::2]))) # In Python 3.x 
['221.180.147.30:86', '61.155.169.11:808'] 

zip(lst[::2], lst[1::2])從布爾汗哈立德的答案出來。

+0

我希望這不會成爲一個「列表中的所有我們可以這樣做的方式「種類的帖子:D – 2014-09-21 04:47:44

+0

@BurhanKhalid,我會停止更新答案;) – falsetru 2014-09-21 04:48:36

1

如果zip(*[iter(lst)]*2)導致有點過分headscratching,嘗試簡單的選擇,使用切片語法:

>>> ['{}:{}'.format(a,b) for a,b in zip(i[::2], i[1::2])] 
['221.180.147.30:86', '61.155.169.11:808'] 

該如何工作是[::2]將跳過列表跳過一個項目,[1::2]做的相同,但跳過第一個項目。實際上,[::2]指「在奇數位置的所有條目」和[1::2]是「在位置是偶數位置的所有條目」:

>>> i 
['221.180.147.30', '86', '61.155.169.11', '808'] 
>>> i[::2] 
['221.180.147.30', '61.155.169.11'] 
>>> i[1::2] 
['86', '808'] 

zip只是結合了這兩個給你「對」元組:

>>> zip(i[::2], i[1::2]) 
[('221.180.147.30', '86'), ('61.155.169.11', '808')] 

接下來是由您來將這些元組轉換爲字符串。 @falsetru做了':'.join(pair),在我的例子中,我使用了字符串格式。有幾個方法可以做到這一點:

>>> ['{}:{}'.format(*pair) for pair in zip(i[::2], i[1::2])] 
['221.180.147.30:86', '61.155.169.11:808'] 
>>> [':'.join(pair) for pair in zip(i[::2], i[1::2])] 
['221.180.147.30:86', '61.155.169.11:808'] 
>>> ['{}:{}'.format(ip, port) for ip, port in zip(i[::2], i[1::2])] 
['221.180.147.30:86', '61.155.169.11:808'] 

我們使用的是列表理解這是計算結果爲列表中的表達式兩者。

+0

+1,我忘了切片;) – falsetru 2014-09-21 04:47:49

0

可能更簡潔...

>>> l = ['221.180.147.30', '86', '61.155.169.11', '808'] 
>>> [':'.join(s) for s in zip(l[::2], l[1::2])] 
['221.180.147.30:86', '61.155.169.11:808'] 

由於插座的源IP,源端口,目的IP,目的端口和協議的元組,它也可以靠近考慮什麼理論型的套接字是。

它看起來像一些人想出了相同的答案。

+1

這與我的回答有什麼不同? – 2014-09-21 04:31:42

+0

看起來它本質上是一樣的。雖然'format'可能比'join'貴一點。 – Jason 2014-09-21 04:38:02

+0

Succinct是Python(和大多數其他語言)中的缺陷。 – msw 2014-09-21 04:43:43

-1
>>> li=['221.180.147.30', '86', '61.155.169.11', '808'] 
>>> [':'.join(t) for t in zip(li[0::2], li[1::2])] 
['221.180.147.30:86', '61.155.169.11:808'] 
+0

請不要發佈重複的答案。 – 2014-09-21 04:32:22

+0

發佈時不重複 – dawg 2014-09-21 04:34:03

相關問題