2017-06-16 12 views
0

2次元のリストを取得して辞書を返す関数を作成しようとしています。私は、私が書いたもの(リストの理解/ itertoolsなど)よりも効率的な方法があるのだろうかと疑問に思っています。私はPythonには比較的新しいですし、リストの理解とitertools doc(https://stackoverflow.com/questions/16548668/iterating-over-a-2-dimensional-python-list)このコードのチャンクに実装してください。辞書にリストアップする - 効率を向上

ご協力いただければ幸いです。ありがとうございました!

def listToDict(self, lstInputs):   
    dictOutput = dict() 
    rows = len(lstInputs) 
    cols = len(lstInputs[0]) 
    if rows == 2: 
     for x in range(rows): 
      if lstInputs[0][x] is not None: 
       if lstInputs[1][x] is not None: 
        dictOutput[lstInputs[0][x].strip()] = lstInputs[1][x].strip() 
       else: 
        dictOutput[lstInputs[0][x].strip()] = lstInputs[1][x] 
    elif cols == 2: 
     for x in range(rows): 
      if lstInputs[x][0] is not None: 
       if lstInputs[x][1] is not None: 
        dictOutput[lstInputs[x][0].strip()] = lstInputs[x][1].strip() 
       else: 
        dictOutput[lstInputs[x][0].strip()] = lstInputs[x][1] 
    else: 
     pass 

    return dictOutput 
+1

あなたは例のリストを提供することはできますか? –

+0

@JanZeiseweisこんにちは!お返事をありがとうございます! https://docs.python.org/3/library/itertools.html#itertools.zip_longestとhttp://jmduke.com/posts/a-gentle-introduction-to-itertools/でいくつかの例を読んだことがありますが、これを助ける1つを見つけるように思われる。リストを連鎖する場合は、ループ時にキーと値のペアを辞書に割り当てる方法を考えることができません – AiRiFiEd

+1

入力と出力の例を示してください。 –

答えて

2

あなたの関数は、あまりにも多くのことをやっている:それは入力だかどうかを確認しようとすると

  1. は、キー=>値のペアのシーケンスまたはキーのペアで、シーケンス値。それは信頼できません。推測しようとしないでください。呼び出し元だけがどのデータを辞書に変換したいのかが分かっているため、正しい構造を渡すのは呼び出し元の義務です。

  2. キーと値のクリーニング(現在はストライピング中)。ここでもまた、両方が文字列である場合にのみ意味を持ちますが、少なくとも文字列であることは保証されていません(少なくとも関数名からもドキュメンテーションでもない)。もちろん、キーや値が実際に文字列であるかどうかをテストすることはできますが、これによってかなりのオーバーヘッドが追加されます。ここでもまた、(最終的な)クリーニングを行うのは発信者の義務です。

長い話を短くするために、あなたの関数は、唯一のクリーンアップを適用する単一のデータ構造(キー=>値のペアの配列、または(キー、値のペアのいずれか)のシーケンスを、期待してはいけません、

実際には、ペアのシーケンス(または繰り返し可能なもの)からdictを構築することは、実際にはとても特殊な機能を必要としないので些細なことですが、それは単なる通過の問題ですdictコンストラクタへのシーケンス:

>>> lst_of_pairs = [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 
>>> dict(lst_of_pairs) 
{0: 'a', 1: 'b', 2: 'c', 3: 'd'} 

またはより高速なことができdictの内包表記を使用して、より最近のpythonのバージョンに:

>>> lst_of_pairs = [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 
>>> {k:v for k, v in lst_of_pairs} 
{0: 'a', 1: 'b', 2: 'c', 3: 'd'} 

とてもうまく、あなたの最初のビルディングブロックは、組み込みであり、任意の特別なFUNCを必要といけません。

これは、1と同じくらいの長さのイタリックで動作することに注意してください。これはペアのみを生成し、2.キー(ペアの最初のアイテム)はユニークです。したがって、ディクティクトを構築する前にいくつかのクリーニングを適用したい場合は、ジェネレータ関数または式で行うことができます。つまり、呼び出し元がすべてのキーが文字列であり、ストライピングが必要であり、あなたはすなわち、代わりにソースリストのジェネレータ式を渡すことができます。

>>> lst_of_pairs = [(" a ", "1 "), ("b ", None), ("c", " fooo ")] 
>>> {k.strip(): v if v is None else v.strip() for k, v in lst_of_pairs} 
{'a': '1', 'c': 'fooo', 'b': None} 

最後に、鍵のペアを転置、キー=>値のペアのシーケンスにシーケンス値がどのような組み込みzip()であり、それは怠惰なバージョンitertools.izip()です

>>> keys = [' a ', 'b ', 'c'] 
>>> values = ['1 ', None, ' fooo '] 
>>> zip(keys, values) 
[(' a ', '1 '), ('b ', None), ('c', ' fooo ')] 
>>> list(itertools.izip(keys, values)) 
[(' a ', '1 '), ('b ', None), ('c', ' fooo ')] 

それは、ワンショットのためになら

>>> {k.strip(): v if v is None else v.strip() for k, v in itertools.izip(keys, values)} 
{'a': '1', 'c': 'fooo', 'b': None} 

:ST「よこしまな」ケース(、キーの順序と値のシーケンスから辞書を構築するキーにストライピングを適用し、conditionnaly値にストライピングを適用するには)のように表すことができます。あなたが必要とするすべてのものを使用してください。

コードの別の場所からこれを適用しなければならないことがわかっている場合、ペアのリストまたはリストのペアを常に同じにして適用する必要がある場合は、できるだけ多くの - ではなく、より:

def to_dict(pairs): 
    return { 
     k.strip(): v if v is None else v.strip()) 
     for k, v in lst_of_pairs 
     } 

、その後、必要に応じて前にzip()を適用するには、発信者に任せる:

def func1(): 
    keys = get_the_keys_from_somewhere() 
    values = get_the_values_too() 
    data = to_dict(itertools.izip(keys, values)) 
    do_something_with(data) 


def func2() 
    pairs = get_some_seqence_of_pairs() 
    data = to_dict(pairs) 
    do_something_with(data) 

あなたがzip()itertools.izip()を使用したい天気をすると、それは主に依存oあなたのPythonバージョンとあなたの入力。あなたは、Python 2.xのを使用している場合

itertools.izip()を遅延それを構築する一方zip()は、メモリ内の新しいリストを作成しますので、わずかなパフォーマンス・オーバーヘッドがitertools.izip()を使用することからありますが、あなたがしている場合には、大量のメモリを節約します大規模なデータセットを扱う

あなたがPython3.xを使用している場合itertools.izip()を交換してその質問は無関係になり、SUS、zip()は、イテレータになってきた;)

+0

ディクテーションの理解とジェネレータの表現...詳細にこれを答える時間をとってくれてありがとう! – AiRiFiEd

0
l = [[1,2,3],['a','b','c']] 

def function(li): 
    d = {} 
    for num in zip(li[0],li[1]): 
     d[num[0]] = num[1] 
    print(d) 
function(l) 
out put: 
{1: 'a', 2: 'b', 3: 'c'} 
+0

そのアイデアはあなたのために働くことができます – joshua

+0

代わりに[[1、 'a']、[2、 'b'] ..]でこれを実装する方法を示すことが可能でしょうか?お詫び! – AiRiFiEd

関連する問題