4

無駄な辞書が必要です。ほとんどの場合、典型的な値だけでなく、いくつかの一意の値にもマップされます。それを取得する最初の方法は、1 つのフラットな「明示的な」辞書リテラルを定義することです。

musicians = {
    'ABBA': 'pop',
    'Avril Lavigne': 'pop',
    ...
    'Mikhail Krug': 'russian chanson',
    'The Rolling Stones': 'rock',
    ...
    'Zaz': 'jazz',
}

2番目 - 典型的なリストの「DRY」束とスペシャルの辞書:

pop_musicians = [
    'ABBA',
    'Avril Lavigne',
    ...
]

rock_musicians = [...]

unusual_musicians = {
    'Mikhail Krug': 'russian chanson',
    'Zaz': 'jazz',
}

musicians = dict(
    [(m, 'pop') for m in pop_musicians] +
    [(m, 'rock') for m in rock_musicians] +
    unusual_musicians.items()
)

私の場合、この例よりもキーと値の関係がはるかに可変であるとします (特定のキーの値は変更される可能性があります)。

あなたはどちらの方法を好みますか、またその理由は何ですか? あなたの意見では、どちらがよりpythonicですか?

4

2 に答える 2

9

私の答えは、データ構造を階層化することです。

genres = {
    "rock": [
        "some rock band",
        "some other rock band",
    ],
    "pop": [
        "some pop star",
        "some pop group",
    ],
}

そして、最初の形式にする必要がある場合は、辞書内包表記がうまく機能します。

musicians = {musician: genre for genre, musicians in genres.items() for musician in musicians}

生産します:

{'some other rock band': 'rock', 'some pop group': 'pop', 'some rock band': 'rock', 'some pop star': 'pop'}

または、多くの複雑な操作をしなければならない場合は、ミュージシャンのクラスを作成して、自由度を高めてください。

于 2012-09-20T21:09:12.470 に答える
2

ミュージシャンの短いリストについては、おそらく最初のオプションが最適です。リストがかなり大きい場合は、2 番目のオプションを使用します。それについて不明確なことは何もなく、タイプミスのリスクを軽減し (ディクテーションが大きくなった場合に発生する可能性が非常に高い)、ミュージシャンを視覚的に区別できるリストに編成します。

于 2012-09-20T21:18:56.337 に答える