我正在尝试获取按姓氏按字母顺序排列的总统名单,即使正在绘制的文件目前列出名字,姓氏,办公日期和离职日期。
以下是我所拥有的,对此我需要做的任何帮助。我一直在寻找一些答案,其中大部分都超出了我的理解水平。我觉得我错过了一些小事。我试图把它们全部分解成一个列表,然后对它们进行排序,但是我无法让它工作,所以这就是我开始的地方。
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()
答案 0 :(得分:2)
你应该做的是将总统列入一个列表,对该列表进行排序,然后打印出结果列表。
在你的for循环之前添加:
presidents = []
在拔出名称/日期后,将此代码放在for循环中
president = (last_name, first_name, start_date, end_date)
presidents.append(president)
for for循环
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:
...
答案 1 :(得分:0)
#!/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()
答案 2 :(得分:0)
我试图将它们全部分解为一个列表,然后对它们进行排序
“他们”是什么意思?
将行拆分为项目列表是一个好的开始:这意味着您将数据视为一组值(其中一个是姓氏),而不仅仅是一个字符串。但是,只排序该列表是没有用的; Python将从行中获取4个字符串(名字,姓氏等)并按顺序排列。
您要做的是列出列表,并按姓氏对其进行排序。
Python的列表提供了一个sort
方法来对它们进行排序。当您将其应用于总统信息列表列表时,它将对这些列表进行排序。但是列表的默认排序将逐项比较它们(首先是第一项,如果第一项相等则是第二项,等等)。您希望按姓氏进行比较,这是您的子列表中的第二个元素。 (即元素1;记住,我们从0开始计算列表元素。)
幸运的是,很容易为Python提供更具体的排序指令。我们可以将sort函数传递给key
参数,该参数是一个将项目“转换”为我们想要对它们进行排序的值的函数。是的,在Python中,一切都是对象 - 包括函数 - 所以将函数作为参数传递没有问题。所以,我们想要“按姓氏”排序,所以我们将传递一个接受一个president-info-list的函数并返回一个姓氏(即元素[1]
)。
幸运的是,这是Python,并且“包括电池”;我们甚至不必自己写这个功能。我们获得了一个神奇的工具,创建函数,返回序列的第n个元素(这就是我们想要的)。它被称为itemgetter
(因为它产生的函数获取序列的第n项 - “item”是更常用的Python术语;“element”是更通用的CS术语),它存在于{{1模块。
顺便说一句,还有更简洁的方法来处理文件打开/关闭,我们不需要编写显式循环来处理读取文件 - 我们可以直接遍历文件({{1} }依次为我们提供文件的行,每次循环一次), 表示我们可以使用operator
(查找它们)。
for line in file:
答案 3 :(得分:0)
我确实让这个工作与上面的Karls帮助,虽然我必须编辑代码让它为我工作,由于我得到的一些错误。我删除了那些并最终得到了这个。
import operator
INPUT_FILE = 'presidents.txt'
OUTPUT_FILE2= 'president_NEW2.txt'
def main():
with open(INPUT_FILE) as infile:
data = [line.rstrip().split('\t') for line in infile]
data.sort(key=operator.itemgetter(0))
outfile=open(OUTPUT_FILE2,'w')
for item in data:
last=item[0]
first=item[1]
start=item[2]
end=item[3]
outfile.write('%s %s was president from %s to %s\n' % (last,first,start,end))
main()的