2017-02-20 141 views
1

我有一個這種格式的元組列表(URL, name)。有時URL是完整的路徑,我只想要www.XXXXX.yyy部分,所以我有一個功能可以分割URL並僅返回該部分。更改元組列表中的第一個元組值

我該如何修改該列表中的所有第一個值,才能得到滿足這種格式的元組的最終列表(my_function(URL), name)

例如: 我有這樣的名單:

my_list = [('www.url.com/index.html', 'url'), 
      ('www.website.org/id/1234/photos', '1234 Photos'), 
      ('www.test.com', 'test')] 

而且我想申請my_function()所有第一的價值觀,獲得下一個最後的名單:

>> print my_list 
[('www.url.com', 'url'), ('www.website.org', '1234 Photos'), ('www.test.com', 'test')] 

回答

5

由於tupleimmutable類型,你不能改變元組的元素/內容。

對於你的情況,你可以做的是用新的元組生成一個列表。

試試這個:

my_list = [('www.url.com/index.html', 'url'), 
      ('www.website.org/id/1234/photos', '1234 Photos'), 
      ('www.test.com', 'test')] 

f = lambda x: x.split('/')[0] 
my_list = [(f(url),name) for url, name in my_list] 
print(my_list) 

輸出:

[('www.url.com', 'url'), ('www.website.org', '1234 Photos'), ('www.test.com', 'test')] 
+0

這就是它!謝謝亞歷克斯:) –

+0

我不認爲這樣處理網址是個好主意(除非你100%確定不會有'http(s)'的任何網址)。我想你應該使用'urlparse'包。 – Dexter

+0

@Dexter我在'my_function'中使用urlparse我只是要求修改元組列表,沒有問題;) –

2
def myfunction(strings):  
    return strings.split('/')[0] 

output = [(myfunction(url), text) for url, text in my_list] 
+0

這就是我一直在尋找:) –

0

嘗試是這樣的:

my_list2 = [] 

for item in my_list: 
    my_list2.append((my_function(item[0]), item[1])) 

print(my_list2) 
+0

什麼是'功能' ? – JRodDynamite

+0

@JRodDynamite:*「...我有一個功能,分裂的網址,並只返回該部分...」* – SiHa

+0

@ SiHa - 哦沒關係。應該在問題中給它命名爲「myFunction」。 – JRodDynamite

2

使用urlparse獲取域(使用子一起)網址:

from urlparse import urlparse 

def netloc_parse(url): 
    if not url.startswith('http'): 
     url = '//' + url 
    return urlparse(url).netloc 

print [(netloc_parse(i[0]), i[1]) for i in my_list] 

輸出,用於這將是:

[('www.url.com', 'url'), ('www.website.org', '1234 Photos'), ('www.test.com', 'test')] 

感謝@Dextersuggestion

+2

你應該使用函數,而不是直接添加'http'字符串。使用類似於'def netloc(url):if url.startswith('http'):url ='//'+ url return urlparse(url)'。如果用戶用'http(s)'添加了任何url,這將是未來的證明。 – Dexter

+0

@Dexter - 好點。 – JRodDynamite

+0

這也是有效的!謝謝 ;) –

相關問題