我们有一个家庭作业,我有一个严重的问题。
关键是使每一行成为一个元组,并将这些元组设置为一个列表。
比如list=[tuple(line1),tuple(line2),tuple(line3),...]
。
此外,还有许多以逗号分隔的字符串,如"aei","1433","lincoln",...
以下是问题:
一本书可以表示为作者的姓氏,作者的名字,标题,日期和ISBN的元组。
编写一个函数readBook()
,给定一个包含此信息的逗号分隔字符串,返回表示该书的元组。
编写一个函数readBooks()
,给定每个书中包含一个逗号分隔行的文本文件的名称,使用readBook()
返回元组列表,每个元组列表描述了一本书。
编写一个函数buildIndex()
,在给定readBooks()
返回的书籍列表的情况下,构建从关键字到书名的地图。关键词是书名中的任何单词,除了“a”,“an”或“the”。
这是我的代码:
RC=("Chann", "Robbbin", "Pride and Prejudice", "2013", "19960418")
RB=("Benjamin","Franklin","The Death of a Robin Thickle", "1725","4637284")
def readBook(lastName, firstName, booktitle, date, isbn):
booktuple=(lastName, firstName, booktitle, date, isbn)
return booktuple
# print readBook("Chen", "Robert", "Pride and Prejudice", "2013", "19960418")
def readBooks(file1):
inputFile = open(file1, "r")
lines = inputFile.readlines()
book = (lines)
inputFile.close()
return book
print readBooks("book.txt")
BooklistR=[RC,RB]
def buildIndex(file2):
inputFile= open("book.txt","r")
Blist = inputFile.readlines()
dictbooks={}
for bookinfo in Blist:
title=bookinfo[2].split()
for infos in title:
if infos.upper()=="A":
title.remove(infos)
elif infos.upper()=="THE":
title.remove(infos)
elif infos.upper()=="AN":
title.remove(infos)
else:
pass
dictbooks[tuple(title)]= bookinfo[2]
return dictbooks
print buildIndex("book.txt")
#Queries#
def lookupKeyword(keywords):
dictbooks=buildIndex(BooklistR)
keys=dictbooks.viewkeys()
values=dictbooks.viewvalues()
for keybook in list(keys):
for keyw in keywords:
for keyk in keybook:
if keyw== keyk:
printoo= dictbooks[keybook]
else:
pass
return printoo
print lookupKeyword("Robin")
答案 0 :(得分:2)
这样的事情出了什么问题?:
with open(someFile) as inputFile:
myListofTuples = [tuple(line.split(',')) for line in inputFile.readlines()]
[根据罗伯特的评论补充说明]
第一行在with
语句中打开文件。 Python with
语句是一个相当新的功能,相当先进。设置上下文,其中代码执行时有一定的保证,当Python引擎退出该上下文时(无论是通过完成工作还是遇到未处理的异常),将如何执行清理和完成代码)。
你可以在Python Docs: Context Managers阅读有关丑陋细节的内容,但其中的主旨是我们打开 someFile 并保证在执行后它会被正确关闭代码留下了上下文(with
语句之后的语句套件。即使我们遇到一些错误或者我们在该套件中的代码引发了一些我们无法捕获的异常,也会这样做。
在这种情况下,我们使用as
子句为我们提供一个本地名称,通过该名称我们可以引用打开的文件对象。 (文件名只是一个字符串,作为参数传递给open()
内置函数...该函数返回的对象需要有一个名称,我们可以通过它来引用它。这类似于谁对于循环中的每次迭代,for i in whatever
语句将 中的每个项目绑定到名称i
。
我们的with
语句的套件(这是在上下文管理器的上下文中运行的缩进语句集)由单个语句组成......列表理解绑定到名称{{ 1}}。
列表理解是另一个相当高级的编程概念。有许多非常高级的语言以各种方式实现它们。在Python的情况下,它们可以追溯到比myListofTuples
语句更早的版本---我认为它们是在2.2左右的时间范围内引入的。
因此,列表推导在Python代码中相当普遍,而with
语句只是慢慢被采用。
Python中的列表文字看起来像:with
列表推导类似但是用表达式替换项目文字列表,这是一行代码,用于计算列表。例如:[something, another_thing, etc, ...]
是一个列表推导,它计算成一个整数列表,它是1到99之间奇数整数的平方。(注意列表解析中没有逗号。表达式代替逗号在列表文字中使用的分隔序列。
在我的示例中,我使用[x*x for x in range(100) if x % 2]
作为表达式的核心,我将其中的每一个拆分为公共(for line in inputFile.readlines()
),然后将结果列表转换为{{1 }}
这只是一种非常简洁的说法:
line.split(',')
答案 1 :(得分:0)
一个可能的计划:
import fileinput
def readBook(str):
l = str.split(',')
t = (l[0:5])
return t
#b = readBook("First,Last,Title,2013,ISBN")
#print b
def readBooks(file):
l = []
for line in fileinput.input(file):
t = readBook(line)
# print t
l.append(t)
return l
books = readBooks("data")
#for t in books:
# for f in t:
# print f
def buildIndex(books):
i = {}
for b in books:
for w in b[2].split():
if w.lower() not in ('a', 'an', 'the'):
if w not in i:
i[w] = []
i[w].append(b[2])
return i
index = buildIndex(books)
for w in sorted(index):
print "Word: ", w
for t in index[w]:
print "Title: ", t
示例数据文件(代码中称为“数据”):
Austen,Jane,Pride and Prejudice,1811,123456789012X
Austen,Jane,Sense and Sensibility,1813,21234567892
Rice-Burroughs,Edgar,Tarzan and the Apes,1911,302912341234X
示例输出:
Word: Apes
Title: Tarzan and the Apes
Word: Prejudice
Title: Pride and Prejudice
Word: Pride
Title: Pride and Prejudice
Word: Sense
Title: Sense and Sensibility
Word: Sensibility
Title: Sense and Sensibility
Word: Tarzan
Title: Tarzan and the Apes
Word: and
Title: Pride and Prejudice
Title: Sense and Sensibility
Title: Tarzan and the Apes
请注意,由于嵌入了逗号,因此数据格式无法支持书籍标题,如“狮子,女巫和魔衣橱”。如果文件是CSV格式,并且字符串周围有引号,那么它可以管理它。
我不确定这是完全最低限度的Pythonic代码(完全不确定),但它确实符合要求。