2015-09-09 81 views
1

确定,因此我将此代码用于带有名称的文本文件,然后使用每个名称的第一个字母作为关键字并重复此字母作为字典值。我需要将其更改为值为与该首字母对应的名称列表的位置。我知道每个字母有多少个名字,但我不知道如何把这些名字变成一个列表,成为价值。 它应该做这样的事情:将字典的值更改为列表

(这是他的文本文件,我的功能会读)

Mary 
Jane 
Anna 
Judith 
Kim 
Melody 
Myriam 
Lauren 
Betty 
Holley 

那么字典应该这样做

{'A':['Anna'], 'B':['Betty'], 'H':['Holley'], 'J':['Judith','Jane'], 'K': 
['Kim'], 'L':['Lauren'], 'M':['Mary','Melody','Myriam']} 

但煤矿将只返回这一点:

{'A':1, 'B':1, 'H':1, 'J':2, 'K':1, 'L':1, 'M':3} 

如何将其更改为我获取名称的位置?

这里是我的代码:

def newDictionary(): 
    names={} 
    char = [] 
    file = open(names) 
    lines = file.readlines() 
    for line in lines: 
     1char = file.read(line[1]) 
     1char.append(char) 
     for keys,values in names(): 

    return names 
+1

不能以数字开头的变量名。你必须写'firstChar'而不是'1char'。此外,字符串索引从0开始,而不是1,并且您不需要执行'file.read(line [0])'因为'line [0]'是一个字符串。 –

回答

1

这应该做的伎俩,只是从file.txt的名称更改为您的文件名:

def newDictionary(): 
    names={} 
    file = open('file.txt') 
    lines = file.read().split('\n') 
    if len(lines) == 1 and len(lines[0]) == 0: 
     print('empty file') 
    else: 
     for line in lines: 
      if line[0] in names: 
       names[(line[0])].append(line) 
      else: 
       names[(line[0])] = [line,] 
    return names 

基本上它的作用是读取文件,分成几行,然后遍历这些行,检查该行的第一个字符是否已经在字典中。如果不是,则将其添加为键,其中值是包含名称读取的数组。如果是,只需将该名称附加到与该键相对应的数组。

Obs:我改变了以前的答案,保持名称末尾的新行。

+0

好吧,我看到你改变了什么,但是当添加splitlines()时,代码不起作用。这之前它工作得很好,除了它在每个名字后面打印\ n之后,因为它们是以新的方式排列的,所以我需要获得这些。我知道我必须用.split()来做,但这只适用于不包含字符串的列表,那么我该怎么做? – April

+0

@四月你用splitlines()得到了什么问题?我只是测试它,它对我很好 – dietbacon

+0

@四月我改变它分裂(),现在试试。虽然我不知道你为什么会出现分割线问题 – dietbacon

2

我会使用collections.defaultdict生成名单:

name_lists = newDictionary("names.txt") 
print name_lists 

defaultdict(, { 'A': ['Anna'], 'B': ['Betty'], 'H': ['Holley'], 'K': ['Kim'], 'J': ['Jane', 'Judith'], 'M': ['Mary', 'Melody', 'Myriam'], 'L': ['Lauren'] })

我们得到数:如何通过首字母生成名单的字典

from collections import defaultdict 
def newDictionary(filename): 
    names = defaultdict(list) 
    with open(filename) as f: 
     for line in f.readlines(): 
      line = line.strip() 
      if line: 
       names[line[0]].append(line) 
    return names 

例每个首字母:

counts = {k: len(v) for k, v in name_lists.items()} 

{'A': 1, 'B': 1, 'H': 1, 'K': 1, 'J': 2, 'M': 3, 'L': 1}

我改变了许多变量名称,因为它们会影响内置函数。

+0

使用''f''而不是''f.readlines()''。文件对象是Python中的迭代器。通过这样做,你也可以切出''line.strip()''。 – pzp

0

您可以使用setdefault

with open('yourfile.txt') as f: 
    d = {} 
    for line in f: 
     lst = [(line[0], line.strip())] 
     for k,v in lst: 
      d.setdefault(k, []).append(v) 
print (d) 

输出:

{'A': ['Anna'], 'B': ['Betty'], 'H': ['Holley'], 'K': ['Kim'], 'J': ['Jane', 'Judith'], 'M': ['Mary', 'Melody', 'Myriam'], 'L': ['Lauren']}