2011-06-22 8 views
1

Iは、次の特性を持つ私の入力のためにdictonaryを有する:Python辞書をソートされたタプルにすると、これをよりうまく処理できますか?

  • 各値は、整数、文字列または反復可能(文字列以外)のいずれかであろう。
  • 要素が反復可能である場合、その反復可能な要素の各要素は文字列または整数のみになります。

EX:

mydict = { 
    'one': 1, 
    'two': '23', 
    'three': 3, 
    'four': [ 
     7, 
     '6', 
     5, 
     8 
    ], 
    'nine': 9 
} 

Iは、各タプルは、キー/値のペアであるタプルのリストに入力を変換する必要があります。反復可能な要素の場合、要素ごとに値でソートされたキーと値のペアがあります。たとえば、上記の出力には、次のようになります。

('four', 5) 
('four', 7) 
('four', 8) 
('four', '6') 
('nine', 9) 
('one', 1) 
('three', 3) 
('two', '2') 

私は現在、これは以下の発電機使用して実装しました:

def dict_to_sorted_tuples(unsorted_dict): 
    for key in sorted(unsorted_dict): 
     if isinstance(unsorted_dict[key], basestring): 
      yield key, unsorted_dict[key] 
      continue 
     try: 
      for v in sorted(unsorted_dict[key]): 
       yield key, v 
     except: 
      yield key, unsorted_dict[key] 

print list(dict_to_sorted_tuples(mydict)) 

を私は、これは、クリーンな方法で改善のための提案を行うことができます感じ?

答えて

5
>>> sorted((i,k) for i,j in mydict.items() for k in ([j] if isinstance(j, str) or isinstance(j, int) else j)) 
[('four', 5), ('four', 7), ('four', 8), ('four', '6'), ('nine', 9), ('one', 1), ('three', 3), ('two', '2')] 

ここでの考え方は、値がintstrであれば、あなたはlistにそれを置くことです。さて、問題は、あなたが値を持っているので、あなたが唯一のintstr(ないサブクラスまたはUnicode)をチェックする必要が本当に確信している場合は、常に

を反復することができ、あなただけ使用できる簡略化されて

sorted((i,k) for i,j in mydict.items() for k in ([j] if type(j) in (int, str) else j)) 
値はユニコードすることができた場合は

、あなたは確かそうオンにする方法を知っています代わりにisinstance(j, str)

+0

isinstance(j, basestring)を使用する必要があります1ライナーにメーピング! :) +1 – Trufa

+0

本当にありがとう! –

+1

@Trufaこの例では、私は1行ではしないことをお勧めします。少なくとも、それをそのままにしておくと、これは、誰かがそれに従って、それを維持しなければならないために何をするのかを説明する複数行のコメントを促すはずです。巧みで表現力がありますが、説明が必要です。 – jozzas

1
for values in sorted(mydict.items()): 
    if isinstance(values[1], list): 
     for x in sorted(values[1]): 
      print (values[0], x,) 
    else: 
     print values 
+1

容易に読むことができます – sam

+0

リスト以外のイテラブルはありませんか?さらに、 'values [0]'と 'values [1]'を使う必要がないので、ソートされたキー(mydict.items())の値をもっと読みやすくすることができます。 – Ben

+0

はいはい...... – sam

0
def dict_to_sorted_tuples(unsorted_dict): 
    res = [] 
    for k, v in sorted(unsorted_dict.iteritems()): 
     if isinstance(v, (list, tuple)): 
      res.extend((k, _v) for _v in sorted(v)) 
     else: 
      res.append((k, v)) 
    return res 
関連する問題