显性与干燥 - 哪种方式更加pythonic?

lev*_*tov 4 python coding-style dry

我需要wast字典,主要是典型值的映射,以及一些独特的值.获得它的第一种方法是定义一个扁平的"显式"字典文字:

musicians = {
    'ABBA': 'pop',
    'Avril Lavigne': 'pop',
    ...
    'Mikhail Krug': 'russian chanson',
    'The Rolling Stones': 'rock',
    ...
    'Zaz': 'jazz',
}
Run Code Online (Sandbox Code Playgroud)

第二 - "干"一堆典型的名单和特价词典:

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()
)
Run Code Online (Sandbox Code Playgroud)

假设在我的情况下键值关系变化更大(某些键的值可能会改变),而不是在这个例子中.

你更喜欢哪种方式?为什么?在您看来,哪一个更pythonic?

Gar*_*tty 9

我的答案是分层数据结构:

genres = {
    "rock": [
        "some rock band",
        "some other rock band",
    ],
    "pop": [
        "some pop star",
        "some pop group",
    ],
}
Run Code Online (Sandbox Code Playgroud)

如果您必须以第一种格式使用它,字典理解将很好地完成工作:

musicians = {musician: genre for genre, musicians in genres.items() for musician in musicians}
Run Code Online (Sandbox Code Playgroud)

会产生:

{'some other rock band': 'rock', 'some pop group': 'pop', 'some rock band': 'rock', 'some pop star': 'pop'}
Run Code Online (Sandbox Code Playgroud)

或者,如果你发现自己不得不做很多复杂的操作,也许可以让音乐家上课给自己更多的自由.

  • @leventov如果您必须拥有该数据结构(过早优化是一个坏主意,请记住),那么字典理解将完成转换它的工作 - 请参阅我更新的答案. (3认同)