あなたの関数は、あまりにも多くのことをやっている:それは入力だかどうかを確認しようとすると
は、キー=>値のペアのシーケンスまたはキーのペアで、シーケンス値。それは信頼できません。推測しようとしないでください。呼び出し元だけがどのデータを辞書に変換したいのかが分かっているため、正しい構造を渡すのは呼び出し元の義務です。
キーと値のクリーニング(現在はストライピング中)。ここでもまた、両方が文字列である場合にのみ意味を持ちますが、少なくとも文字列であることは保証されていません(少なくとも関数名からもドキュメンテーションでもない)。もちろん、キーや値が実際に文字列であるかどうかをテストすることはできますが、これによってかなりのオーバーヘッドが追加されます。ここでもまた、(最終的な)クリーニングを行うのは発信者の義務です。
長い話を短くするために、あなたの関数は、唯一のクリーンアップを適用する単一のデータ構造(キー=>値のペアの配列、または(キー、値のペアのいずれか)のシーケンスを、期待してはいけません、
実際には、ペアのシーケンス(または繰り返し可能なもの)から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()
は、イテレータになってきた;)
あなたは例のリストを提供することはできますか? –
@JanZeiseweisこんにちは!お返事をありがとうございます! https://docs.python.org/3/library/itertools.html#itertools.zip_longestとhttp://jmduke.com/posts/a-gentle-introduction-to-itertools/でいくつかの例を読んだことがありますが、これを助ける1つを見つけるように思われる。リストを連鎖する場合は、ループ時にキーと値のペアを辞書に割り当てる方法を考えることができません – AiRiFiEd
入力と出力の例を示してください。 –