1

次の特性を持つ入力用の辞書があります。

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

元:

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

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

('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))

これはよりクリーンな方法で実行できると思いますが、改善のための提案はありますか?

4

3 に答える 3

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')]

ここでの考え方は、値がintまたは の場合str、それを に入れるというものlistです。いつでも反復できる値があるため、問題は単純化されました

intまたはstr(サブクラスやユニコードではなく)のみをチェックする必要があると本当に確信している場合は、単に使用できます

sorted((i,k) for i,j in mydict.items() for k in ([j] if type(j) in (int, str) else j))

値がユニコードになる場合は、isinstance(j, basestring)代わりに使用する必要がありますisinstance(j, str)

于 2011-06-22T05:22:17.260 に答える
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
于 2011-06-22T05:51:43.077 に答える
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
于 2011-06-22T09:31:20.080 に答える