2016-03-04 445 views
1

我有一個類,com_and_url,包含2個變量,com和url。如:如何通過Python讀取for循環中的2個值?

a = com_and_url(com, url) 

和文件我想讀其內容是這樣的:

Google 
www.google.com 
yahoo 
www.yahoo.com 
facebook 
www.facebook.com 

因此,這裏是僞代碼:

list_com_and_url = [] 

for com, url in f: 
    list_com_and_url.append(com_and_url(com, url)) 

蟒蛇能做到這一點?謝謝您的幫助!

回答

2

試試這個:

list_com_and_url = [] 
with open('my_file') as f: 
    for line in f: 
     name, url = line, next(f) 
     list_com_and_url.append(zip(name, url)) 
+0

爲什麼downvote?任何季節? – Hackaholic

+0

這對我來說是最簡單和最可讀的方式。 +1 :) – rrw

+0

@richmondwang它可以工作,但是我並沒有在'f'的循環內使用'next(f)'來特別易讀。 – njzk2

0

作爲內存方面的優化方式(使用迭代器並拒絕加載內存中的所有行),可以使用itertools.tee()從文件對象(它是一個迭代器)創建兩個獨立的迭代器,然後使用itertools.islice()f中的偶數行和next_f中的奇數行然後使用zip()函數(在python 2 itertools.izip()中)創建包含pair列的迭代器。

from itertools import tee, islice 

with open('my_file') as f: 
    next_f, f = tee(f) 
    next_f, f = islice(f, 0, None, 2), islice(next_f, 1, None, 2) 
    list_com_and_url = [com_and_url(com, url) for com, url in zip(f, next_f)] 
+0

爲什麼你消耗的第一行? – njzk2

+0

謝謝你的回答!這對我來說真的是一個全新的方法。我需要一點時間來消化它!謝謝:) –

+0

,這不符合你的想法。例如,輸入'[1,2,3,4]',輸出預計爲'[[1,2],[3,4]]',這返回'[[1,2]], [2,3],[3,4]]' – njzk2

1

最短和(我發現)最明顯的方法是使用切片:

lines = f.readlines() 
for com, url in zip(lines[::2], lines[1::2]): 
    # Do stuff 

(諾塔:不,不適合在內存中的文件嘗試此)

+0

@Kasramvd那裏。 – njzk2

+0

這是一個精確的方法,並根據運行時進行了優化。但在內存使用的角度來看,這是一個非常昂貴的方法,特別是當我們處理大文件時。 – Kasramvd

0

你可以剛剛看了兩行同時

with open('file.txt') as f: 
    lines = f.read().splitlines() 
    com_and_url = (lines[i:i+2] for i in range(0, len(lines), 2)) 

這將返回一個發電機,所以要輸出到列表

print(list(com_and_url)) 

輸出

[['Google', 'www.google.com'], 
['yahoo', 'www.yahoo.com'], 
['facebook', 'www.facebook.com']]