2013-07-10 38 views
0

在test.txt的:删除和复制保存在另一个文件

1 a 
2 b 
3 c 
4 a 
5 d 
6 c 

我想删除重复和保存休息的test2.txt:

2 b 
5 d 

我试图启动与代码下面。

file1 = open('../test.txt').read().split('\n') 
#file2 = open('../test2.txt', "w") 
word = set() 
for line in file1: 
    if line: 
     sline = line.split('\t') 
     if sline[1] not in word: 
      print sline[0], sline[1]    
      word.add(sline[1]) 
#file2.close() 

从码结果表明:

1 a 
2 b 
3 c 
5 d 

什么建议吗?

+0

与您的代码的问题是,第一次遇到任何字母它不会已经在字集中,所以不是利弊认为是重复的。如Ashwini的答案所示,你需要在你的名单上拿两张通行证。 – Alan

回答

3

你可以在这里使用collections.Orderedict

>>> from collections import OrderedDict 
with open('abc') as f: 
    dic = OrderedDict() 
    for line in f: 
     v,k = line.split() 
     dic.setdefault(k,[]).append(v) 

现在dic样子:

OrderedDict([('a', ['1', '4']), ('b', ['2']), ('c', ['3', '6']), ('d', ['5'])]) 

现在,我们只需要那些包含在列表中只有1项键。

for k,v in dic.iteritems(): 
    if len(v) == 1:   
     print v[0],k 
...   
2 b 
5 d 
+0

@ThanaDaray对py2.6及更早版本使用'Ordered Dictionary'配方。 http://code.activestate.com/recipes/576693-ordered-dictionary-for-py24/ –

+0

@ThanaDaray只需用'file.write'替换'print'语句即可。 –

+0

我改编你的代码。它说“ValueError:需要超过0个值才能解包”任何建议? – ThanaDaray

1

你正在做的是你只是确保每一个第二项(字母)打印出来只有一次。这显然不是你想说的。

您必须将代码分成两部分 - 阅读和收集有关字母计数的统计信息,以及仅打印具有count == 1的代码的部分。

转换您的原代码(我只是做更简单一些):

file1 = open('../test.txt') 
words = {} 
for line in file1: 
    if line: 
     line_num, letter = line.split('\t') 
     if letter not in words: 
      words[letter] = [1, line_num] 
     else: 
      words[letter][0] += 1 

for letter, (count, line_num) in words.iteritems(): 
    if count == 1: 
     print line_num, letter 
+0

+1。为了简化,使用'default_factory'设置为'int' – iruvar

+0

1_CR:'defaultdict'不起作用,因为我在字典中存储具有两个值的列表,并且该列表中的第二项('line_num')发生了变化为每一行。我同意它可以使用'defaultdict'编写,但它会更复杂,我想保持简单,愚蠢 –

0

怎么样熊猫

import pandas as pd 

a = pd.read_csv("test_remove_dupl.txt",sep=",") 

b = a.drop_duplicates(cols="a") 
1

我试图保持它类似于您的stlye地:

file1 = open('../test.txt').read().split('\n') 

word = set() 
test = [] 
duplicate = [] 
sin_duple = [] 
num_lines = 0; 
num_duplicates = 0; 
for line in file1: 
    if line: 
     sline = line.split(' ') 
     test.append(" ".join([sline[0], sline[1]])) 
     if (sline[1] not in word): 
      word.add(sline[1]) 
      num_lines = num_lines + 1; 
     else: 
      sin_duple.append(sline[1]) 
      duplicate.append(" ".join([sline[0], sline[1]])) 
      num_lines = num_lines + 1; 
      num_duplicates = num_duplicates + 1; 

for i in range (0,num_lines+1): 
    for item in test: 
     for j in range(0, num_duplicates): 
      #print((str(i) + " " + str(sin_duple[j]))) 
      if item == (str(i) + " " + str(sin_duple[j])): 
       test.remove(item) 


file2 = open("../test2.txt", 'w') 
for item in test: 
    file2.write("%s\n" % item) 
file2.close() 
相关问题