-1

私はこのコードを書いています:

#!/usr/bin/python
#ekadasi 2013
#sukhdev mohan
import datetime
import pickle
from time import strptime

def openfile(path, mode):
       return open(path, mode)

def closefile(obj):
       obj.close()

def retrivedata(pntr):
       date = {}
       linelst = []
       wordlst = []
       for line in pntr:
              for word in line.split():
                     wordlst.append(word)
              linelst.append(wordlst)
              wordlst = []
       return linelst


def dumpitall(obj, pntr):
       pickle.dump(obj, pntr)

def loaditall(srcpntr):
       return pickle.load(srcpntr)

date = datetime.date.today()
print "E K A D A S I  2 0 1 3 "
print "Today: %d - %d - %d" % (date.day, date.month, date.year)     

dates = {}
filepntr = openfile("ekadasi.txt", "r")
nlist = retrivedata(filepntr)
closefile(filepntr)
for nl in nlist:
       print nl
       temp = nl[0] + "-" + str(strptime(nl[1], '%B').tm_mon)
       print temp
       value = str(nl[2] + nl[3])
       dates = dict((temp, value))

print dates

私は4つの列を持つファイルを読んでいます:日月名(空白のある2列)、あなたが読むことができるように、それを読んでからリストのリストに入れます。私が目指しているのは、タイプの辞書を持つことです:日-月の数:名前ですが、辞書がファイルとリストのリストと同じ順序ではない理由がわかりません。例:最初の要素これは File: 08 January xyz asd List: [['08', 'January', 'xyz', 'asd'], ... ] key : 08-1 すべて期待どおりですが、辞書は他の要素として最初と最初が2番目に来ます...どうすれば修正できますか? このコードを書く良い方法や最適化する方法はありますか?

みんなありがとう

4

2 に答える 2

0

次のようになります。

Uku Loskit が言及したように、コレクションから OrderedDict を使用します。また、for ループをそれほど多く使用する必要はありません。必要なのは 1 つだけです。また、読みやすくするために string.format() を使用します。これは Python 3 の主なスタイルです。

import datetime
import collections
from time import strptime

date = datetime.date.today()
print "E K A D A S I  2 0 1 3 "
print "Today: {day} - {month} - {year}".format(
    day   = date.day,
    month = date.month,
    year  = date.year
)

dates = collections.OrderedDict()
with open('ekadasi.txt', 'r') as file_data:
    for line in file_data.readlines():
        if line:  # if line is not empty
            day, month, name1, name2 = line.split()
            temp = '{day}-{month}'.format(
                day = day,
                month = strptime(month, '%B').tm_mon
            )
            dates[temp] = str(name1 + name2)
print dates
于 2013-05-23T14:42:28.057 に答える
0

ディクショナリ値の順序は決して保証されません。代わりにOrderedDictを使用してください

于 2013-05-23T09:20:29.360 に答える