2016-05-06 16 views
1

重要:valueがリストの場合、keyとそのリストの各項目に対して複数のkey, valueタプルを取得したいとします。ディクショナリ内の値は、少なくとも文字列、int、およびリストを含む複数の型からなります。Python辞書をタプルのリストに簡潔に変換するにはどうしたらいいですか?

私は以下の解決策を持っていますが、これを行うためのより簡潔な方法があるかどうかは疑問です。

# Sample data 
d = {'key1': 'string1', 
    'key2': 15, 
    'key3': ['item1', 'item2', 'item3', 'item4']} 

# This code does what I want 
parameters = [] 
for k, v in d.iteritems(): 
    if isinstance(v, str): 
     parameters.append((k ,v)) 
    elif isinstance(v, int): 
     parameters.append((k, v)) 
    elif isinstance(v, list): 
     for x,y in zip(itertools.repeat(k), v): 
      parameters.append((x, y)) 
    else: 
     continue 

parameters 
# [('key1', 'string1'), 
# ('key2', 15), 
# ('key3', 'item1'), 
# ('key3', 'item2'), 
# ('key3', 'item3'), 
# ('key3', 'item4')] 

答えて

2

はリスト内包と短いバージョンです:

>>> d = {'key1': 'string1', 'key2': 15, 'key3': ['item1', 'item2', 'item3', 'item4']} 
>>> parameters = [(k, v1) for k, v in d.iteritems() for v1 in (v if isinstance(v, list) else [v])] 
>>> parameters 
[('key3', 'item1'), ('key3', 'item2'), ('key3', 'item3'), ('key3', 'item4'), ('key2', 15), ('key1', 'string1')] 
3

私は可読性のためにリスト内包が好きです。また、なぜ文字列とintに対して別のステートメントが必要なのかわかりません。リストがあるかどうか。

parameters = [] 
for k, v in d.iteritems(): 
    if isinstance(v, list): 
    parameters.extend([(k, i) for i in v]) 
    else: 
    parameters.append((k, v)) 

結果:ここで

>>> parameters 
[('key3', 'item1'), ('key3', 'item2'), ('key3', 'item3'), ('key3', 'item4'), ('key2', 15), ('key1', 'string1')] 
+0

がわかりました、ありがとうございました。私は文字列とintを明示的にチェックしました。これは、私が下流で扱うことのできない奇妙なタプルを与えるかもしれない他の型を除外したかったからです。 – John

関連する問題