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

时间:2012-09-20 21:06:20

标签: python coding-style dry

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

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

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

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?

2 个答案:

答案 0 :(得分:9)

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

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

如果您必须以第一种格式使用它,dictionary comprehension可以很好地完成工作:

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'}

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

答案 1 :(得分:2)

对于一个音乐家的简短列表,第一个选项可能是最好的。如果你有相当大的列表,我会选择第二个选项。关于它没有什么不清楚,它降低了拼写错误的风险(如果dict变大,这很可能),并且它还将音乐家组织成视觉上不同的列表。