如何在Python中按字母顺序排列文件?

时间:2011-08-12 04:38:48

标签: 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 个答案:

答案 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()的