3

Defaultdict と Counter についていくつか質問があります。1 行に 1 文のテキスト ファイルがある状況があります。文を (最初のスペースで) 2 つに分割し、最初の部分文字列をキーとして、2 番目の部分文字列を値として辞書に格納します。これを行う理由は、同じキーを共有する文の総数を取得できるようにするためです。

Text file format:
d1 This is an example
id3 Hello World
id1 This is also an example
id4 Hello Hello World
.
.

これは私が試したものですが、うまくいきません。私はカウンターを見てきましたが、私の状況では少し注意が必要です。

try:
    openFileObject = open('test.txt', "r")
    try:             

        with openFileObject as infile:
            for line in infile:

                #Break up line into two strings at first space                    
                tempLine = line.split(' ' , 1)

                classDict = defaultdict(tempLine)         
                for tempLine[0], tempLine[1] in tempLine: 
                    classDict[tempLine[0]].append(tempLine[1]) 

            #Get the total number of keys  
            len(classDict)

            #Get value for key id1 (should return 2) 

    finally:
        print 'Done.'
        openFileObject.close()
except IOError:
    pass

Counter または defaultdict を使用する前に、文を分割して巨大なリストにタプルとして保存せずにこれを行う方法はありますか? ありがとう!

編集:答えてくれたすべての人に感謝します。私は最終的に私がこれで間違っていた場所を見つけました。皆さんからの提案をすべて取り入れてプログラムを編集しました。

openFileObject = open(filename, "r")           
tempList = []

with openFileObject as infile:
    for line in infile:

        tempLine = line.split(' ' , 1)
        tempList.append(tempLine) 

        classDict = defaultdict(list) #My error is here where I used tempLine instead if list
        for key, value in tempList: 
            classDict[key].append(value)   

            print len(classDict) 
            print len(classDict['key'])   
4

3 に答える 3

2

collections.Counter「同じキーを共有する文の総数を取得する」ために使用します。

from collections import Counter
with openFileObject as infile:
    print Counter(x.split()[0] for x in infile)

印刷します

Counter({'id1': 2, 'id4': 1, 'id3': 1})

すべての行のリストを保存したい場合、主な間違いはここにあります

classDict = defaultdict(tempLine)

このパターンでは、使用する必要があります

classDict = defaultdict(list)

しかし、長さをインデントするだけなら、これらすべての行をリストに格納しても意味がありません。

于 2013-06-17T03:43:11.010 に答える
1

dict.get(key, 0)現在の累積カウントを返します。キーが dict にない場合は、0 を返します。

classDict = {}

with open('text.txt') as infile:
    for line in infile:
        key = line.split(' ' , 1)[0]
        classDict[key] = classDict.get(key, 0) + 1

    print(len(classDict))
    for key in classDict:
        print('{}: {}'.format(key, classDict[key]))

http://docs.python.org/3/library/stdtypes.html#dict.get

于 2013-06-17T03:25:18.823 に答える