itertools.groupby
タブ区切りの短いテキストファイルを解析するために使用しています。テキストファイルにはいくつかの列があり、特定の列に特定の値を持つすべてのエントリをグループ化するだけですx
。以下のコードはname2
、変数の値を探して、と呼ばれる列に対してこれを行いますx
。csv.DictReader
とを使用してこれを実行しようとしましitertools.groupby
た。テーブルには、この基準に一致する8つの行があるため、8つのエントリが返されます。代わりgroupby
に、2セットのエントリを返します。1つは1つのエントリで、もう1つは7で、これは間違った動作のようです。同じデータに対して以下の手動でマッチングを行い、正しい結果を取得します。
import itertools, operator, csv
col_name = "name2"
x = "ENSMUSG00000002459"
print "looking for entries with value %s in column %s" %(x, col_name)
print "groupby gets it wrong: "
data = csv.DictReader(open(f), delimiter="\t", fieldnames=fieldnames)
for name, entries in itertools.groupby(data, key=operator.itemgetter(col_name)):
if name == "ENSMUSG00000002459":
wrong_result = [e for e in entries]
print "wrong result has %d entries" %(len(wrong_result))
print "manually grouping entries is correct: "
data = csv.DictReader(open(f), delimiter="\t", fieldnames=fieldnames)
correct_result = []
for row in data:
if row[col_name] == "ENSMUSG00000002459":
correct_result.append(row)
print "correct result has %d entries" %(len(correct_result))
私が得る出力は次のとおりです。
looking for entries with value ENSMUSG00000002459 in column name2
groupby gets it wrong:
wrong result has 7 entries
wrong result has 1 entries
manually grouping entries is correct:
correct result has 8 entries
ここで何が起こっているのですか?が本当にグループ化されている場合groupby
は、ごとに1セットのエントリのみを取得する必要があるようですx
が、代わりに2つを返します。私はこれを理解することはできません。 編集:ああ、それはソートされるべきだと思いました。