2013-07-24 110 views
0

我有可能会是这样一个文本文件,图书索引...Python中创建的文本文件

3:degree 
54:connected 
93:adjacent 
54:vertex 
19:edge 
64:neighbor 
72:path 
55:shortest path 
127:tree 
3:degree 
55:graph 
64:adjacent and so on.... 

我希望有我的函数read每一行文本,并在结肠分裂它做它变成一个字典,其中的单词处于“关键”位置,并且页码处于字典的“值”位置 - 然后我必须创建一个新的字典并扫描每个单词,如果它已经在字典中只需在页面后面添加页码,如果它不在字典中,我会将它添加到字典中。

这是到目前为止我的想法......

def index(fileName): 

    inFile=open(fileName,'r') 
    index={} 
    for line in inFile: 
     line=line.strip()  #This will get rid of my new line character 
     word=line[1] 
     if word not in index: 
      index[word]=[] 
      index[word].append(line) 
    return index 

fileName='terms.txt' 

print(index(fileName)) 

我在正确的页面上,但只需要一点点帮助,走了。

+0

你有没有看这个,HTTP://stackoverflow.com/questions/3199171/append-multiple-values-for-one-key-在-python的词典?方法相似。 – AppliedNumbers

回答

0

编辑线我评论与# edit

def index(fileName): 
    inFile=open(fileName,'r') 
    index={} 
    for line in inFile: 
     line=line.strip().split(':',1) # edit 
     word,index=line # edit 
     if word not in index: 
      index[word]=[] 
     index[word].append(index) # edit 
    return index 
+0

使用'index.setdefault'将if-else条件缩短为一行。 –

0

你是不是分裂线,你只取字符的位置是1

使用.split(':', 1)分割线一次:

def index(filename): 
    with open(filename) as infile: 
     index = {} 
     for line in infile: 
      page, word = map(str.strip, line.split(':', 1)) 
      index.setdefault(word, []).append(int(page)) 
     return index 

您可能希望使用一个集合来避免相同的页码被添加两次。您还可以使用collections.defaultdict到这一点了进一步简化依旧:

from collections import defaultdict 

def index(filename): 
    with open(filename) as infile: 
     index = defaultdict(set) 
     for line in infile: 
      page, word = map(str.strip, line.split(':', 1)) 
      index[word].add(int(page)) 
     return index 

这给:

defaultdict(<type 'set'>, {'neighbor': set([64]), 'degree': set([3]), 'tree': set([127]), 'vertex': set([54]), 'shortest path': set([55]), 'edge': set([19]), 'connected': set([54]), 'adjacent': set([64, 93]), 'graph': set([55]), 'path': set([72])}) 

您的输入文字; defaultdictdict的子类,其行为与普通字典相似,只不过它会为您尝试访问的每个密钥创建一个新的set,但尚不存在。

+0

非常感谢 - 我想添加一行将所有大写字母转换为小写字母的行 - 我是否必须将它转换为字符串才能将其转换为小写字母,然后转换为按字母顺序排列的列表? – user2553807

+0

d = str(index) for element in d: element.lower()#会是这样的工作吗? – user2553807

+0

不要把'index'变成一个字符串,它是一个字典。我不确定你在这里试图达到什么目的; 'index [word.lower()] .add(int(page))'将存储小写字母开始。 –

0

您可以使用str.split将字符串分隔为标记。在你的情况下,分隔符是:

records = """3:degree 
    54:connected 
    93:adjacent 
    54:vertex""" 
index = {} 
for line in records.split('\n'): 
    page, word = line.split(':') 
    index[word] = int(page.strip()) 

index 
# {'vertex': 54, 'connected': 54, 'adjacent': 93, 'degree': 3} 

在某些时候,您将需要处理具有多个页面引用的单词。对于这一点,我建议用list作为默认创建collections.defaultdict

from collections import defaultdict 
index = defaultdict(list) 
index[word].append(page) # add reference to this page