Python 明确性与干性——哪种方式更像蟒蛇?

Python 明确性与干性——哪种方式更像蟒蛇?,python,coding-style,dry,Python,Coding Style,Dry,我需要wast字典,主要映射典型值,以及一些独特值。 获取它的第一种方法是定义一个平面“显式”字典文本: musicians = { 'ABBA': 'pop', 'Avril Lavigne': 'pop', ... 'Mikhail Krug': 'russian chanson', 'The Rolling Stones': 'rock', ... 'Zaz': 'jazz', } 第二,“干燥”的典型列表和特价词典: pop_mu

我需要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()
)
假设在我的例子中,键值关系的变量(某些键的值可能会改变)比在本例中要大得多


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

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

genres = {
    "rock": [
        "some rock band",
        "some other rock band",
    ],
    "pop": [
        "some pop star",
        "some pop group",
    ],
}
如果必须采用第一种格式,a将很好地完成这项工作:

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

或者,如果你发现自己需要做很多复杂的操作,也许可以制作一个音乐家类来给自己更多的自由。

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

我更喜欢第一个。它的可读性更好,而且据我所知,比你的第二种方法要短得多。还要记住,这种类型的问题不适合堆栈溢出。这更多的是一个品味或观点的问题。我喜欢“米哈伊尔·克鲁格”。抱歉,DRY不一定意味着“尽可能简短和压缩”。@chepner同意。我认为清晰是最重要的。第二种解决方案(或Lattyware的替代版本)有一个巨大的优势:如果你必须输入1000次“pop”,你至少会出错一次……但是,正如Paul Manta所说,如果你只有20次,第一个更易于阅读。我还需要尽可能快地通过键检索值。平面字典是强制性的。@leventov如果您必须拥有该数据结构(记住,过早优化是个坏主意),那么字典理解将完成转换它的工作-请参阅我的更新答案。+1,因为这是对OP的“干式”解决方案的改进(更一般,更清楚的是结构是如何组合在一起的,它仍然保留了不必输入“pop”1000次的优点,并且希望您永远不要输入错误)。但更重要的是,您选择的是他的“干式”解决方案,而不是他的“显式”解决方案,以及为什么,在改进之前……不幸的是,在我的例子中,对值(它们是函数)进行散列并没有多大意义。但我喜欢你的思维方式。@leventov函数是Python中与其他任何函数一样的对象,并且是可散列的-没有理由不将其用作键。