2017-06-22 8 views
0

質問です:効率的かつpythonically dictのmy_dictにリストmy_listのリストを変換する方法ので、すべてのネストされたリストのゼロ番目の要素がキーであり、残りの要素は値(リストも含む)です。、そのためのn番目の要素をのdictには、リストを変換キー

例:

入力:

my_list = [['a', 'b'], 
      ['b', 'c', 'd', 'e', 'f'], 
      ['g'], 
      ['h', 'i', 'j'], 
      ['k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']] 

出力:

my_dict = {'a': ['b'], 
      'b': ['c', 'd', 'e', 'f'], 
      'g': None, 
      'h': ['i', 'j'], 
      'k': ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']} 

サイドノート:メソッドは、クリーンで効率的にする必要があるので 私のデータセットが巨大です。リストを反復処理することは受け入れられますが、(O(n)の複雑さを保つために)入れ子になるループは避けてください。私は、入力リストを反復処理して0番目の要素をポップする作業を行う関数を書くことに成功しましたが、popping is itself O(n)は全体の解をO(n * n)にしています。

+2

何もし 'mydict [i]が[0]'重複を持っていますか? – voidpro

+0

あなたは 'my_list'を意味しましたか?dictでは重複しているキーがあれば古い値を上書きします。あなたが 'my_list'を意味していた場合、重複があるとは思われません。スクリプトの早い段階でチェックします。 – Artur

+1

はい。私は 'my_list [i] [0]'を意味しました。重複がない場合、以下の回答はデータの中断なしに機能します。 – voidpro

答えて

7

辞書理解を使用してください。

dct = {lst[0]: lst[1:] or None for lst in my_list} 
pprint(dct) 

{'a': ['b'], 
'b': ['c', 'd', 'e', 'f'], 
'g': None, 
'h': ['i', 'j'], 
'k': ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']} 

複雑:値リストまたはNoneor演算子を使用してNoneとインデックス1からリストのスライスを短絡して作成され

複雑このdictのcomp。 O(n * m)です。ここで、nはリスト内の項目数であり、mは最大スライスの長さです。ここでの利得は、時間の複雑さの削減にはなりませんが、CPU時間の短縮につながります。

+1

oops、私は少し遅れているようですが、あなたのスピードに合わせてもう1つです:) –

+0

または「{a:bのためのbまたはなし、y_listの* b}」 –

+2

@Chris_Randsはい、しかし*拡張アンパック*はPython 3 –

0

あなたが行うことができ、

{ item[0]: item[1:] or None for item in my_list } 
2

あなたはdict comprehensionを使用することができます。

>>> { i[0]:i[1:] or None for i in my_list} 
{'a': ['b'], 
'b': ['c', 'd', 'e', 'f'], 
'g': None, 
'h': ['i', 'j'], 
'k': ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']} 
0

これはO(n)のソリューションを提供します。

my_list = [['a', 'b'], 
     ['b', 'c', 'd', 'e', 'f'], 
     ['g'], 
     ['h', 'i', 'j'], 
     ['k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']] 
print(my_list) 
my_dict={} 
for x in my_list: 
    my_dict[x[0]]=x[1:] 
print(my_dict) 

しかし、キー

+0

これはO(N * N)であり、x [1:] – farincz

+0

@farinczによって引き起こされます。これは私の心配です。 – Artur

+0

@farincz @Artur私は、スライシングは 'O(end-start)'を取ると仮定します。したがって、複雑さは各スライスのサイズに依存します。この場合、キー 'a、b、g、h'ではほとんど無視されます。ですから、私は 'O(n)とO(end-start)'の最大値について述べました。私が間違っているなら、私を訂正してください。 – voidpro

0

リストのスライスのいずれかの重複があってはならないことを心に留めておくあなたはタプルを使用している場合は、同じO(N)の複雑さを持っています。私はあなたが与えられた入力データ構造でO(N * N)より良くなることができないのではないかと思います。

0

使用辞書のcmprh

{i[0]:i[1:] or None for i in my_list} 

出力:

{'a': ['b'], 'h': ['i', 'j'], 'k': ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'], 'b': ['c', 'd', 'e', 'f'], 'g': None} 
+0

なぜ投票が下りますか? –

+0

誰でも投票理由を説明できますか? –

関連する問題