我们得到一个文件(.txt)格式:
Johnson, Joana
Volleyball Club
Erickson, John
Mcdonald, Joe
Smith, Johnny
Debate Club
Chess Club
McIlroy, Molly
Dino, Dennis
Jackson, Jamie
Gibson, Ginny
Fried, John
我必须编写一个函数来调用这个文件并返回一个字典:{'first person's name':[每个节中的朋友列表]所以应该返回:
{'Johnson,Joana':['Erickson,John','Mcdonald,Joe'],'Smith,Johnny':['McIlroy,Molly','Dino,Dennis'],'Jackson,Jamie': ['Gibson,Ginny','Fried,John']}我在下面编写了一个函数,但它只处理文件的第一个节而不是所有节,因此返回:
{'Johnson,Joana':['Erickson,John','Mcdonald,Joe']}
我只是python的初学者,所以如果有人可以帮助我而不会使它复杂化我会非常感激,我似乎无法处理整个文件
def name_to_friends(file):
'''(file open for reading) -> dict of {str: list of str}
'''
for line in file:
dic = {}
lst = []
for line in file:
if line == '\n':
dic.update({lst[0]:lst[1:]})
break
else:
name = line.strip()
if ',' in line:
lst.append(line)
return dic
答案 0 :(得分:3)
你快到了;删除break
;每次在字典中添加其他名称和朋友时清除列表对象:
def name_to_friends(file):
for line in file:
dic = {}
lst = []
for line in file:
if line == '\n':
dic.update({lst[0]:lst[1:]})
lst = []
else:
name = line.strip()
if ',' in line:
lst.append(line)
if lst:
dic.update({lst[0]:lst[1:]})
return dic
当文件末尾没有空行时,需要最后if lst
。
当您第一次遇到空行时,break
语句将完全停止读取该文件;通过删除它,你可以继续下一个区块。
更惯用的方法是:
def name_to_friends(file):
dic = {}
for line in file:
line = line.strip()
# skip empty lines until we find the start of a block
if not line:
continue
friends = dic[line] = []
for line in file:
line = line.strip()
if not line:
break # end of block, continue to the next list of friends
if ',' in line:
friends.append(line)
return dic
这会在第一个内部的文件行上嵌套第二个循环;这也会提高文件行的读取位置,所以当内循环停止时(因为文件已完成或我们只是读取一个空行),外循环将继续读取我们离开的位置。
答案 1 :(得分:3)
如果文件不是太大,您可以简单地执行类似
的操作{k[0]: k[1:] for k in [l.split('\n') for l in file.read().split('\n\n')]}
编辑:删除俱乐部(无逗号)
{k[0]: [fr for fr in k[1:] if ',' in fr] for k in [ln.split('\n') for ln in file.read().split('\n\n')]}