2017-07-14 103 views
1

所以我有很多行看起來像這樣的一個txt文件:txt文件蟒蛇唯一值

2107|Business|2117|Art|2137|Art|2145|English 

本質上講,它是一個隨機的學生主要和編碼學期一年,他們才宣佈它。我希望能夠做的是在學期中讀出每個獨特的專業最初被宣佈。從上面的行我需要:

2107:Business 

2117: Art 

2145: English 

我試圖用Python中的熊貓做到這一點,但真的不能得到任何工作。 任何幫助表示讚賞?編輯: 應該澄清。我不希望代碼在Art的第二個實例中讀取。每個專業只有第一個聲明和之前的學期。

+0

什麼是最終結果的類型?只是絃樂? –

+0

字符串正常工作。我想作爲最終結果的一個數據透視表將加密學生id作爲數據透視表,下一列將顯示3行,顯示術語('2107','2117','2145')和最後一列以及相應的每個學期每行都有專業。 –

+0

然後字符串可能不是最好的選擇。我想你會想要一個元組。這樣數據更容易訪問。 Blotosmetek的答案不應該太難以適應,但如果字符串適合你,那麼你就是金。 –

回答

0

使用Python的CSV庫來幫助將每一行分割成一列單元格。然後,您可以使用Python的grouper()配方是用來取n項目在同一時間裏列表:

import csv 
import itertools 

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx 
    args = [iter(iterable)] * n 
    return itertools.izip_longest(fillvalue=fillvalue, *args) 

seen = set() 

with open('input3.txt', 'rb') as f_input: 
    for row in csv.reader(f_input, delimiter='|'): 
     for k, v in grouper(row, 2): 
      if v not in seen: 
       print "{}: {}".format(k, v) 
       seen.add(v) 

因此,對於您的示例文件中的行,這將給你:

2107: Business 
2117: Art 
2145: English 
+0

這看起來不錯,但有沒有辦法只讀第一個藝術的實例?所以最終的結果將是2107:商業,2117:藝術,2145:英語。 –

+0

您可以將每個主題添加到一個集合中,並在打印之前測試它是否在集合中。我已經相應地更新了腳本。 –

0

假設l包含一行 「像這樣」:

a = l.split('|') 
for t in zip(a[0::2], a[1::2]): 
    print("{}: {}".format(*t)) 
0

您可以使用csv模塊加載文件。例如:

import csv 
    with open('file.txt', 'rb') as f: 
    reader = csv.reader(f, delimiter='|') 
    for row in reader: 
     print row 

現在你有一個文件中的所有列表rowrow[n] n的所有偶數值都是一年/學期,而n的所有奇數值都是主要的。