0

各キーに値としてリストがあり、それらのリストのサイズが異なる辞書があります。add と set を使用してキーと値を入力しました (重複を避けるため)。辞書を出力すると、出力は次のようになります。

blizzard set(['00:13:e8:17:9f:25', '00:21:6a:33:81:50', '58:bc:27:13:37:c9', '00:19:d2:33:ad:9d'])
alpha_jian set(['00:13:e8:17:9f:25'])  

ここで、blizzard と alpha_jian は、私の辞書の 2 つのキーです。

今、次のような2つの列を持つ別のテキストファイルがあります

00:21:6a:33:81:50    45  
00:13:e8:17:9f:25    59  

ご覧のとおり、最初の列の項目は、辞書の各リストのエントリの 1 つです。たとえば、00:21:6a:33:81:50 はキー「blizzard」に属し、00:13:e8:17:9f:25 はキー「alpha_jian」に属します。

私が望む問題は、テキストファイルの最初の列項目を調べ、その列エントリが辞書にある場合は、対応するキーを見つけ、対応するリストの長さを辞書で見つけ、それらを新しい辞書に追加することです。 newDict.
たとえば、00:21:6a:33:81:50 はブリザードに属します。したがって、newDict エントリは次のようになります。

newDict[blizzard] = 4  // since the blizzard key corresponds to a list of length 4.  

これは、このタスクを実行すると予想されるコードです。

newDict = dict()
# myDict is present with entries like specified above
with open("input.txt") as f:
    for line in f:  
        fields = line.split("\t")  
        for key, value in myDict.items():
            if fields[0] == #Some Expression:
                newdict[key] = len(value)  
print newDict  

ここで、私の質問は、上記のコードで #Some Expression とすべきものです。値がリストでない場合、これは非常に簡単です。しかし、リストを検索するにはどうすればよいでしょうか。前もって感謝します。

4

4 に答える 4

1

あなたは探しているin

if fields[0] in value:

しかし、これは dict 値を何度もスキャンする必要があるため、あまり効率的な方法ではありません。

あなたは助けるために一時的なデータ構造を作ることができます

helper_dict = {k: v for v, x in myDict.items() for k in x}

だからあなたのコードは

helper_dict = {k: v for v, x in myDict.items() for k in x}
with open("input.txt") as f:
    for line in f:  
        fields = line.split("\t")
        key = fields[0]
        if key in helper_dict:
            newdict[helper_dict[key]] = len(myDict[helper_dict[key]])
于 2013-07-22T21:49:37.340 に答える
0

しません

if fields[0] in value:

あなたの問題を解決しますか?または、あなたの質問がわかりませんか?

于 2013-07-22T21:49:15.280 に答える
0

if fields[0] in value:上記のことから、長さが1以上であるかどうかにかかわらず、辞書内のすべての値がセットであることを考えると、トリックを行う必要があります。

'00:13:e8:17:9f:25'ただし、開始する前に、(これらが一意であると仮定して)キーと、関連する値がセット内のエントリの数である新しい辞書を作成する方がおそらく効率的です。これにより、このようなものを繰り返し再計算することを回避できます。明らかに、リストがそれほど長くない場合、大きな違いはありません。

于 2013-07-22T21:49:29.400 に答える