【问题标题】:Python - Assigning Multiple Keys for a Single ValuePython - 为单个值分配多个键
【发布时间】:2014-10-26 00:26:22
【问题描述】:

我希望能够在 Python 中为这些值分配以下键:

  • 数字 01 - 10:5.01
  • 数字 11 - 20:7.02
  • 数字 21 - 30:9.03
  • 数字 31 - 40:11.04
  • 数字 41 - 50:15.00
  • 数字 51 - 60:17.08
  • 数字 61 - 70:19.15

我知道这是可能的:

rates = dict.fromkeys(range(1, 11), 5.01)
rates.update(dict.fromkeys(range(11, 21), 7.02)
# ...etc

没关系。但是,有没有办法在 Python 中的一行或一个初始化列表中做到这一点?

【问题讨论】:

  • 这是个好问题。我也很想知道这段代码的一行。首先要回答您的问题,这是可能的。 Python 社区声称 Python 中的任何语句都有一个单一的答案。
  • @Andy:我认为你误解了应该有一种明显的方法来做某事;这确实意味着每件事都有一条线。这只是意味着 Python 试图为您提供清晰的语法,而不是过多的方法来做同样的事情。
  • @MartijnPieters 这正是我想说的,但用不同的词。请原谅我的英语。
  • 我猜你所说的一行是指一行或多行

标签: python dictionary key range key-value


【解决方案1】:

使用字典推导和初始映射:

numbers = {1: 5.01, 11: 7.02, 21: 9.03, 31: 11.04, 41: 15.0, 51: 71.08, 61: 19.15}
numbers = {k: v for start, v in numbers.items() for k in range(start, start + 10)}

演示:

>>> from pprint import pprint
>>> numbers = {1: 5.01, 11: 7.02, 21: 9.03, 31: 11.04, 41: 15.0, 51: 71.08, 61: 19.15}
>>> numbers = {k: v for start, v in numbers.items() for k in range(start, start + 10)}
>>> pprint(numbers)
{1: 5.01,
 2: 5.01,
 3: 5.01,
 4: 5.01,
 5: 5.01,
 6: 5.01,
 7: 5.01,
 8: 5.01,
 9: 5.01,
 10: 5.01,
 11: 7.02,
 12: 7.02,
 13: 7.02,
 14: 7.02,
 15: 7.02,
 16: 7.02,
 17: 7.02,
 18: 7.02,
 19: 7.02,
 20: 7.02,
 21: 9.03,
 22: 9.03,
 23: 9.03,
 24: 9.03,
 25: 9.03,
 26: 9.03,
 27: 9.03,
 28: 9.03,
 29: 9.03,
 30: 9.03,
 31: 11.04,
 32: 11.04,
 33: 11.04,
 34: 11.04,
 35: 11.04,
 36: 11.04,
 37: 11.04,
 38: 11.04,
 39: 11.04,
 40: 11.04,
 41: 15.0,
 42: 15.0,
 43: 15.0,
 44: 15.0,
 45: 15.0,
 46: 15.0,
 47: 15.0,
 48: 15.0,
 49: 15.0,
 50: 15.0,
 51: 71.08,
 52: 71.08,
 53: 71.08,
 54: 71.08,
 55: 71.08,
 56: 71.08,
 57: 71.08,
 58: 71.08,
 59: 71.08,
 60: 71.08,
 61: 19.15,
 62: 19.15,
 63: 19.15,
 64: 19.15,
 65: 19.15,
 66: 19.15,
 67: 19.15,
 68: 19.15,
 69: 19.15,
 70: 19.15}

字典表达式为循环的每次迭代生成一个键和一个值。该表达式中有两个循环,您需要按照嵌套顺序从左到右读取它们。写成一组不可理解的循环,你会得到:

numbers = {1: 5.01, 11: 7.02, 21: 9.03, 31: 11.04, 41: 15.0, 51: 71.08, 61: 19.15}
output = {}
# loop over the (key, value) pairs in the numbers dictionary
for start, v in numbers.items():
    for k in range(start, start + 10):
        output[k] = v
numbers = output

基本上原始numbers 字典中的键被转换为范围以在输出字典中形成10个新键,所有键都具有相同的值。

【讨论】:

  • 太棒了,非常感谢!从来没有想过要进行字典理解。
  • 您介意再解释一下这里的语法吗?我仍在努力思考这是如何工作的。谢谢。
  • @homersimpson:我为您添加了字典理解的扩展版本,是否更清楚?
  • @martigin-pieters:是的!谢谢你 - 这非常有帮助。我不知道你可以在推导中嵌套循环。
猜你喜欢
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
相关资源
最近更新 更多