2

私はPythonでdictに取り組んでいます。私はそれをアルファベット順に並べ替え、分割して少し見栄えを良くしようとしています。ここに私が辞書でこれまでに持っているコードがあります。

authorentry = {'author':  name, 'date': datef , 'path': path_change , 'msg' : xmlMsgf }           
if not name in author:
    author[ name ] = []

author[ name ].append( authorentry )       

if not authorentry in author.items():
    author['author'] = [authorentry]

print sorted (author.keys()), sorted (author.values())

今私がやりたいことは、作者と日付に基づいてソートされた順序で辞書を出力することです。また、それを分割して変更し、可能な場合はコンマと 'u' がすべて含まれないようにします。それを達成する方法についてのアイデアはありますか?

そのまま印刷するとこんな感じ。

私が望む方法は、著者が日付ではなくリストの最初に表示されることです。できればアルファベット順で、エントリのコンマを削除してきれいに印刷したいと思います。出来ますか?

[[{'date': ['06-08-2012 09:01:52 PM'], 'path': [u'/branches/Patch_4_2_0_Branch'], 'msg': ['none', u'PATCH_BRANCH:N/A\nBUG_NUMBER:N/A\nFEATURE_AFFECTED:N/A\nOVERVIEW:N/A\nAdding the SVN log size requirement to the branch \n'], 'author': u'glv'}], [{'date': ['06-08-2012 09:01:52 PM'], 'path': [u'/branches/Patch_4_2_0_Branch'], 'msg': ['none', u'PATCH_BRANCH:N/A\nBUG_NUMBER:N/A\nFEATURE_AFFECTED:N/A\nOVERVIEW:N/A\nAdding the SVN log size requirement to the branch \n'], 'author': u'glv'}]]

更新: 現在、著者をグループ化することはできますが、何らかの理由でアルファベット順に並べ替えることができないだけでなく、著者をリストの最初の人にすることさえできません。表示されるのは、次のようなものです。

 Date: 06-08-2012 08:56:09 PM

  Changes by : glv

  Comments: PATCH_BRANCH:N/A BUG_NUMBER:N/A FEATURE_AFFECTED:N/A OVERVIEW:N/A Adding the svn commit line requrement  

            Directory Location: /trunk

私が注文したかった方法は、このようなものです。

  Changes by : glv
  Date: 06-08-2012 08:56:09 PM
  Directory Location: /trunk
  Comments: PATCH_BRANCH:N/A BUG_NUMBER:N/A FEATURE_AFFECTED:N/A OVERVIEW:N/A Adding the svn commit line requrement

OrderedList を試して、そのように機能するかどうかを確認しましたが、これまでのところ運も成功もありません。足りないものはありますか?

4

2 に答える 2

2

ユーザーが読みやすいようにこの情報を表示したいだけなら、pprintモジュールを使用してください。

import pprint
pprint.pprint(author)

であると仮定しauthorますdict。または、コンマを削除するなど、pprint.pformatさらに操作/クリーンアップできる文字列を取得するために使用します。print pprint.pformat(author).replace(',','')

dicts は本質的にキーがハッシュ (セットのような) であるハッシュテーブルであるため、並べ替えできないことも知っておく必要があります。

次を使用して試すこともできますcollections.OrdererdDict

from collections import OrdererdDict
sorted_author = OrderedDict(sorted(author.iteritems()))

更新:これでまだ問題が発生しているのは奇妙です。間違いなく機能するコードをいくつか提供し、そこから適応させることができます:

def format_author(author):
    tups = sorted(author.iteritems())           # alphabetical sorting
    kmaxlen = max([len(k) for k, v in tups])    # for output alignment

    # some custom rearrangement. if there is a 'msg' key, we want it last
    tupkeys = [k for k, v in tups]
    if 'msg' in tupkeys:
        msg_tup = tups.pop(tupkeys.index('msg'))
        tups.append(msg_tup)    # append to the end
        # alternatively tups.insert(0, msg_tup) would insert at front

    output = []

    for k, v in tups:
        # dress our values
        if not v:
            v = ''
        elif isinstance(v, list):
            if len(v) == 1:
                v = v[0]
            if len(v) == 2 and v[0] in [None, 'none', 'None']:
                v = v[1]
         v = v.strip()
        output.append("%s: %s" % (k.rjust(kmaxlen), v))
    return "\n".join(output)

次に、次のようなことができます。

author = {'date': ['06-08-2012 09:01:52 PM'], 'path': [u'/branches/Patch_4_2_0_Branch'], 'author': u'glv', 'msg': ['none', u'blah blah blah \n']}
s = format_author(author)
print s

次のような出力を取得します。

author: glv
  date: 06-08-2012 09:01:52 PM
  path: /branches/Patch_4_2_0_Branch
   msg: blah blah blah
于 2012-09-04T15:11:10.247 に答える
1

dict を使用してメソッドauthorentryを実装する代わりに、クラスを作成することを検討してください。__str__

class authorentry:
    # create authorentry; usage: x = authorentry(author, date, path, msg)
    def __init__(self, author, date, path, msg):
        self.author = author
        self.date = date
        self.path = path
        self.msg = msg
    # return string representation for authorentry
    def __str__(self):
        return "Authorentry(name: %s, date: %r, path: ...)" % (self.author, self.date, ...)

authorentryこれで、次のように作成して印刷できます。

ae = authorentry("some name", "some date", "some path", "some message")
print ae
于 2012-09-04T16:24:55.670 に答える