1

入力ファイルが次のような場合、これまで辞書を正常に実装した場合があります。

line1 field1   field2   field3   field4   field5  
line2 field1   field2   field3   field4   field5  

等々.....

行番号をキーtuple (field1, field2, field3, field4)として、辞書の対応する値として を作成しました。ここで、field5 を の値として含めたいと思いますkey (field1, field2, field3, field4)。つまりtuple (field1, field2, field3, field4)、同時にキーと値である必要があります。この種の実装はPythonで可能ですか?

4

3 に答える 3

0

http://docs.python.org/library/functions.html?highlight=tuple#tuple

tuple は、シーケンス型 — str、unicode、list、tuple、bytearray、buffer、xrange で説明されているように、不変のシーケンス型です。他のコンテナについては、組み込みの dict、list、set クラス、および collections モジュールを参照してください。

タプルは不変であるため、タプルからアイテムを追加または削除することはできません。変数を変更するには、変数を再構築する必要があります。反復可能な変数を時間内に変更する予定がある場合は、 を使用しますlist

タプルが不変であることを除けば、質問は少しあいまいです。

field5辞書に追加する方法を次に示します。

a = {1:(f1,f2,f3,f4), 2:(f1,f2,f3,f4)} # this is our dictionary contains tuple

for key, value in a.iteritems(): # iterate over dictionary
    a[key] += (field5,) # comma is important, you can only concanate tuple with tuple.


# or you can do
a[linenumber] += (field5,)
于 2012-07-02T18:08:17.867 に答える
0

あなたの質問が正しく理解できれば、はい。しかし、大規模なセットのために非常に多くのスペースを浪費することになります.

dic     = {}
tuple1  = ("field1","field2","field3","field4")

dic["line1"] = tuple1
dic[tuple1]  = "field5"

print dic["line1"]
print dic[tuple1]
于 2012-07-02T16:37:13.487 に答える
0

つまり、タプル (field1、field2、field3、field4) は同時にキーと値である必要があります。この種の実装はPythonで可能ですか?

はい。あなたがこのようにすることを止めるものは何もありません:

key = ("f1", "f2", "f3", "f4", "f5")
value = ("f1", "f2", "f3", "f4", "f5")
d = {key: value}

私があなたを正しく理解していれば、あなたは今まで次のようなことをしてきました:

line_no = 1
d = {}
for line in open(FILE):
    d[line_no] = line  # line = ("f1", "f2", "f3", "f4")
    line_no += 1

..?

そうでない場合は、どこが間違っているかを詳しく説明するか、ソースコードを投稿してください:)

編集:

わかりました、コメントをありがとう、私は今理解したと思います。私は次のようにします:

d = {}
for line in open(FILE):
    d[line] = []
    d[line].append(f5)  # line = ("f1", "f2", "f3", "f4"), f5 = timestamp

そうすれば、タプル全体をキーとして使用し、同一の f1、f2、f3、f4 を持つレコードからタイムスタンプ (f5) を差し引くことができます。私には、SQLで行う方がはるかに簡単に思えます。

そうすれば、負荷が増加しても一定のルックアップ時間と線形時間が得られます。しかし、キーが自明でないサイズの場合、パフォーマンスが少し低下すると思います。

タイムスタンプを互いに抽出する方法について考えさせてください..

EDIT2:

はい、ペアの最初の要素のリストを作成できます: fl = [p[0] for p inpair]] そして、複数回出現する人を除外します:

このようなもの l2 = [l for l in fl if len(l) > 1]

しかし、それはあまり効率的ではないようです..

于 2012-07-02T16:55:52.733 に答える