0

私が見ている問題は次のとおりです。辞書のリストを取得します。この中には、有効な結果と無効な結果の明らかなケースがあります。したがって、リスト内包表記内に単純な三項演算子を記述して、失敗時にデフォルトのメッセージを取得します。ただし、失敗ごとにデフォルトが提供されます。

すべてのリストが同じ長さであることがわかっている場合、これを同じ理解内の単一の失敗メッセージに減らすことは可能ですか?

このコード例の目的は、キーがリスト内の辞書にない場合に 'DEFAULT' の値を持つようにすることです。テストするために、簡単な印刷を行います。

print(out)
>>> ['DEFAILT']

これが私のテストデータと単純で成功した結果です:

lis_dic = [{1:'One',2:'Two',3:'Three'},
    {1:'Ichi',2:'Ni',3:'San'},
    {1:'Eins',2:'Zvi',3:'Dri'}]
key = 1
out = [i[key] for i in lis_dic]
print(out)
>>> ['One', 'Ichi', 'Eins']

エラー処理試行:

key = 4
out = [i[key] for i in lis_dic if key in i]
print(out)
>>> []

out = [i.get(key, 'DEFAILT') for i in lis_dic]
print(out)
>>> ['DEFAILT', 'DEFAILT', 'DEFAILT']

out = [i[key] if key in i else 'DEFAULT' for i in lis_dic ]
print(out)
>>> ['DEFAILT', 'DEFAILT', 'DEFAILT']

ご覧のとおり、これらの結果はすべて、単一の結果ではなく、結果がないか、3 つの結果になります。

また、else の場所を移動しようとしましたが、構文エラーが発生し続けました。

ああ、これは有効な結果の順序を変更する可能性があるため、役に立ちません。

out = list(set([i[key] if key in i else 'DEFAULT' for i in lis_dic ]))
4

3 に答える 3

2

キーは 3 つの辞書のいずれにもないため、'DEFAULT'値は 3 回生成されます。最初のディクショナリに値が含まれていて、他の 2 つのディクショナリに含まれていない場合、値が 1 つと が 2 つのリストが得られます'DEFAULT'。とにかく、試してください:

out = [i[key] for i in lis_dic if key in i] or ['DEFAULT']
于 2013-07-04T18:41:00.180 に答える
1

データ構造に制約がない限り、最も簡単な解決策は一度変換することです。そのため、必要な情報を毎回取得するのは簡単です。実際に何をしているかにもよりますが、これはおそらくより効率的です。

変換されたデータ構造は次のようになります。

transformed_lis_dic = {
    1: ['One', 'Ichi', 'Eins'], 
    2: ['Two', 'Ni', 'Zvi'],
    3: ['Three', 'San', 'Dri']
}

out = transformed_lis_dic.get(key, ['DEFAULT'])

次の方法で変換を行うことができます。

from collections import defaultdict

transformed_lis_dic = defaultdict(list)
for dic in lis_dic:
    for key, val in dic.iteritems():
        transformed_lis_dic[key].append(val)
于 2013-07-04T19:19:04.720 に答える
0

独自の関数を作成して、すべてのキーを完全に取得するか、単一のデフォルトを返すことができます-例:

lis_dic = [{1:'One',2:'Two',3:'Three'},
    {1:'Ichi',2:'Ni',3:'San'},
    {1:'Eins',2:'Zvi',3:'Dri'}]

from operator import itemgetter
def single(key, *dicts, **kwargs):
    default = kwargs.get('default', 'DEFAULT')
    try:
        return map(itemgetter(key), dicts)
    except KeyError:
        return default

print single(3, *lis_dic)
# ['Three', 'San', 'Dri']
print single(4, *lis_dic)
# DEFAULT
于 2013-07-04T18:41:03.730 に答える