2013-05-14 102 views
3

第一個索引通過排序列表的最優雅方式是什麼?輸入:逐行比較文件python

Meni22 xxxx xxxx 
Meni32_2 xxxx xxxx 
Meni32_2 xxxx xxxx 
Meni45_1 xxxx xxxx 
Meni45_1 xxxx xxxx 
Meni45 xxxx xxxx 

它是由線走線槽線:

list1 = [] 
list2 = [] 
for line in input: 
    if line[0] not in list1: 
    list.append(line) 
else: 
    list2.append(line) 

實例不會明顯工作。它添加行[0]的第一個匹配並繼續。我寧願讓它通過列表,添加到list1行,它只發現一次,並休息到list2。

腳本後:

List1: 

Meni22 xxxx xxxx 
Meni45 xxxx xxxx 

List2: 

Meni45_1 xxxx xxxx 
Meni45_1 xxxx xxxx 
Meni32_2 xxxx xxxx 
Meni32_2 xxxx xxxx 
+0

這些'xxxx xxxx'對於每一條開始相同的行都是一樣的嗎? – geoffspear 2013-05-14 10:30:16

+0

您的輸入有多少列?兩三個? – jamylak 2013-05-14 10:30:17

+0

目前還不清楚你想在這裏實現什麼。根據「腳本之後」部分,您是否想根據第一個標記是否包含下劃線將輸入拆分爲兩個列表? – Aya 2013-05-14 10:34:11

回答

2

您可以使用collections.Counter

from collections import Counter 
lis1 = [] 
lis2 = [] 
with open("abc") as f: 
    c = Counter(line.split()[0] for line in f) 

for key,val in c.items(): 
    if val == 1: 
     lis1.append(key) 
    else: 
     lis2.extend([key]*val) 
print lis1 
print lis2 

輸出:

['Meni45', 'Meni22'] 
['Meni32_2', 'Meni32_2', 'Meni45_1', 'Meni45_1'] 

編輯:

from collections import defaultdict 
lis1 = [] 
lis2 = [] 

with open("abc") as f: 
    dic = defaultdict(list) 
    for line in f: 
     spl =line.split() 
     dic[spl[0]].append(spl[1:]) 

for key,val in dic.items(): 
    if len(val) == 1: 
     lis1.append(key) 
    else: 
     lis2.append(key) 
print lis1 
print lis2 

print dic["Meni32_2"] #access columns related to any key from the the dict 

輸出:

['Meni45', 'Meni22'] 
['Meni32_2', 'Meni45_1'] 
[['xxxx', 'xxxx'], ['xxxx', 'xxxx']] 
+1

如果文件沒有排序,這是一個好方法 – 2013-05-14 10:40:12

+0

很好地工作,但由於我們在這裏按[0]分割,它會從列表中刪除其他列。那不是打算的。任何方式來解決這個問題? – jester112358 2013-05-14 11:17:36

+0

@ jester112358是的,你可以在這種情況下使用'collections.defaultdict',看看我更新的解決方案。 – 2013-05-14 11:23:48

1

考慮使用difflib

import difflib 

d = difflib.Differ() 
fa = open('a.txt'); fb = open('b.txt') 

diff = d.compare("".join(fa.readlines()), "".join(fb.readlines())) 
print ''.join(list(diff)) 

fa.close(); fb.close() 
3

由於文件進行排序,你可以使用groupby

from itertools import groupby 
list1, list2 = res = [], [] 
with open('file1.txt', 'rb') as fin: 
    for k,g in groupby(fin, key=lambda x:x.partition(' ')[0]): 
     g = list(g) 
     res[len(g) > 1] += g 

或者如果你喜歡這個更長的版本

from itertools import groupby 
list1, list2 = [], [] 
with open('file1.txt', 'rb') as fin: 
    for k,g in groupby(fin, key=lambda x:x.partition(' ')[0]): 
     g = list(g) 
     if len(g) > 1: 
      list2 += g 
     else: 
      list1 += g