如何在Python中按字母顺序排列文件?
我想要得到一个按姓氏字母顺序排列的总统名单,虽然我现在用的文件是按名字、姓氏、任职日期和离职日期的顺序列出的。
这是我目前的代码,想请教一下我需要怎么做。我在网上找了一些答案,但大多数都超出了我的理解能力。我觉得我可能漏掉了什么小细节。我尝试把所有内容分开成一个列表,然后再排序,但没能成功,所以我就从这里开始了。
INPUT_FILE = 'presidents.txt'
OUTPUT_FILE = 'president_NEW.txt'
OUTPUT_FILE2 = 'president_NEW2.txt'
def main():
infile = open(INPUT_FILE)
outfile = open(OUTPUT_FILE, 'w')
outfile2 = open(OUTPUT_FILE2,'w')
stuff = infile.readline()
while stuff:
stuff = stuff.rstrip()
data = stuff.split('\t')
president_First = data[1]
president_Last = data[0]
start_date = data[2]
end_date = data[3]
sentence = '%s %s was president from %s to %s' % \
(president_First,president_Last,start_date,end_date)
sentence2 = '%s %s was president from %s to %s' % \
(president_Last,president_First,start_date, end_date)
outfile2.write(sentence2+ '\n')
outfile.write(sentence + '\n')
stuff = infile.readline()
infile.close()
outfile.close()
main()
4 个回答
我试着把它们都分开成一个列表,然后进行排序。
你说的“它们”指的是什么呢?
把一行数据分成一个个项目的列表是个不错的开始:这意味着你把数据当成一组值来看待(其中一个值是姓氏),而不是仅仅把它当成一个字符串。不过,仅仅对这个列表进行排序是没用的;Python会把这一行中的四个字符串(名字、姓氏等等)按顺序排列。
你想要的是一个包含这些列表的列表,并且按姓氏进行排序。
Python的列表提供了一个sort
方法,可以用来排序。当你把它应用到总统信息列表时,它会对这些列表进行排序。但是,默认的排序方式是逐项比较(先比较第一个项目,如果相同再比较第二个项目,依此类推)。你想要的是按姓氏比较,而姓氏在你的子列表中是第二个元素。(也就是说,元素1;记住,我们从0开始计数列表中的元素。)
幸运的是,给Python提供更具体的排序指令是很简单的。我们可以给排序函数传递一个key
参数,这个参数是一个“翻译”项目的函数,用来告诉Python我们想按什么来排序。没错,在Python中,一切都是对象——包括函数——所以把函数作为参数传递没有问题。因此,我们想按“姓氏”排序,所以我们需要传递一个函数,这个函数接受一个总统信息列表并返回姓氏(也就是元素[1]
)。
幸运的是,这里是Python,“电池已包含”;我们甚至不需要自己写那个函数。我们有一个神奇的工具,可以创建返回序列中第n个元素的函数(这正是我们想要的)。这个工具叫做itemgetter
(因为它创建一个获取序列中第n个项目的函数——“项目”是Python中更常用的术语;“元素”是更一般的计算机科学术语),它在operator
模块中。
顺便说一下,还有更简洁的方法来处理文件的打开和关闭,我们不需要写一个明确的循环来读取文件——我们可以直接遍历文件(for line in file:
会依次给我们文件中的每一行,每次循环一次),而这意味着我们可以直接使用list comprehension
(可以查一下这个概念)。
import operator
def main():
# We'll set up 'infile' to refer to the opened input file, making sure it is automatically
# closed once we're done with it. We do that with a 'with' block; we're "done with the file"
# at the end of the block.
with open(INPUT_FILE) as infile:
# We want the splitted, rstripped line for each line in the infile, which is spelled:
data = [line.rstrip().split('\t') for line in infile]
# Now we re-arrange that data. We want to sort the data, using an item-getter for
# item 1 (the last name) as the sort-key. That is spelled:
data.sort(key=operator.itemgetter(1))
with open(OUTPUT_FILE) as outfile:
# Let's say we want to write the formatted string for each line in the data.
# Now we're taking action instead of calculating a result, so we don't want
# a list comprehension any more - so we iterate over the items of the sorted data:
for item in data:
# The item already contains all the values we want to interpolate into the string,
# in the right order; so we can pass it directly as our set of values to interpolate:
outfile.write('%s %s was president from %s to %s' % item)
当然可以!请看下面的内容:
这个问题主要是关于如何在编程中处理某些特定的情况。很多时候,我们在写代码的时候会遇到一些问题,比如说代码运行得不如预期,或者出现错误。为了找到解决方案,程序员们会在网上提问,像是在StackOverflow这样的论坛上。
在这些讨论中,大家会分享自己的经验,提供解决问题的方法,或者解释某些概念。这样一来,其他人就可以从中学习,避免犯同样的错误。
总之,编程是一项需要不断学习和实践的技能,遇到问题时,寻求帮助是非常正常的。希望这些信息对你有帮助!
#!/usr/bin/env python
# this sounds like a homework problem, but ...
from __future__ import with_statement # not necessary on newer versions
def main():
# input
with open('presidents.txt', 'r') as fi:
# read and parse
presidents = [[x.strip() for x in line.split(',')] for line in fi]
# sort
presidents = sorted(presidents, cmp=lambda x, y: cmp(x[1], y[1]))
# output
with open('presidents_out.txt', 'w') as fo:
for pres in presidents:
print >> fo, "president %s %s was president %s %s" % tuple(pres)
if __name__ == '__main__':
main()
你应该把总统的名字放到一个列表里,然后对这个列表进行排序,最后把排序后的列表打印出来。
在你的循环之前加上:
presidents = []
在你提取名字和日期之后,把这段代码放在循环里面:
president = (last_name, first_name, start_date, end_date)
presidents.append(president)
在循环结束之后:
presidents.sort() # because we put last_name first above
# it will sort by last_name
然后打印出来:
for president in presidents
last_name, first_name, start_date, end_date = president
string1 = "..."
听起来你是想把它们分成一个列表。如果你在这方面遇到困难,可以把你尝试的代码给我们看看。这是解决这个问题的正确方法。
其他评论:
你的代码有几个地方可以简化。你可以选择忽略这些建议,或者根据自己的需要使用:
president_First=data[1]
president_Last= data[0]
start_date=data[2]
end_date=data[3]
可以写成:
president_Last, president_First, start_date, end_date = data
stuff=infile.readline()
还有
while stuff:
stuff=stuff.rstrip()
data=stuff.split('\t')
...
stuff = infile.readline()
可以写成:
for stuff in infile:
...