3

Pythonには、次の形式のネストされた辞書が2つあります。

1166869: {'probL2': '0.000', 'probL1': '0.000', 'pronNDiff_site': '1.000', 'StateBin': '0', 'chr': 'chrX', 'rangehist': '59254000-59255000', 'start_bin': '59254000', 'countL2': '4', 'countL1': '0'} 

1166870: {'probL2': '0.148', 'probL1': '0.000', 'pronNDiff_site': '0.851', 'StateBin': '0', 'chr': 'chr2', 'rangehist': '59254000-59255000', 'start_bin': '59255000', 'countL2': '5', 'countL1': '15'} 

1166871: {'probL2': '0.000', 'probL1': '0.000', 'pronNDiff_site': '1.000', 'StateBin': '0', 'chr': 'chrY', 'rangehist': '59290000-59291000', 'start_bin': '59290000', 'countL2': '1', 'countL1': '2'}

ここで、1166869、1166870、および1166871は、データを読み取ったファイル内の行を表し、残りのキーはデータ自体です。

ここで、繰り返し値がいくつかあるため、キー「chr」にすべての異なる値を格納するリストを作成したいと思います。

辞書を調べて2つの値を比較するにはどうすればよいですか?このコードは機能していません:

for k in range(len(file_dict)):
    for j in range(len(file_dict)-1):
        if (file_dict[j]["chr"] != file_dict[k]["chr"]):
            list_chr.append(file_dict[j]["chr"])
4

2 に答える 2

7

セットを使用すると、一度にすべてのアイテムを使用できます。

chr = { v['chr'] for v in file_dict.itervalues() }

これは、集合の内包的性質を使用して、1行のコードで集合を生成します。

セット内包表記はPython2.7で導入されました。以前のバージョンでは以下を使用します。

chr = set(v['chr'] for v in file_dict.itervalues())

Python 3では、をに置き換える必要があり.itervalues()ます.values()

Python辞書はリストではないため、独自のコードは機能しません。インデックスではなく、キーで値を取得します。次のように変更する必要があります。

for key in file_dict:
    for other_key in file_dict:
        if key == other_key:
            continue

        if file_dict[key]['chr'] != file_dict[otherkey]['chr']:
            list_chr.append(filed_dict[key]['chr'])

しかし、それは本当に非効率的であり、間違っていることは言うまでもありません。

于 2012-12-07T11:16:25.420 に答える
1

次のようなものはどうですか。

list_chr = list(set([val['chr'] for val in file_dict.values()]))

これはどのように作動しますか?

最初にリスト内包表記が内部辞書のすべてのchrエントリを取得し、次にこれらがセットに変換されます。これにより、重複するエントリがなくなり、希望する形式の場合はリストに変換されます。

本当にセットを使用したい場合は、ルックアップ時間がO(n)ではなくO(1)であることに注意してください。

于 2012-12-07T11:33:42.603 に答える