【问题标题】:List comprehensions in python nested loopspython嵌套循环中的列表推导
【发布时间】:2016-03-26 12:40:12
【问题描述】:
scrabble_scores = [(1, "EAOINRTLSU"), (2, "DG"), (3, "BCMP"),
               (4, "FHVWY"), (5, "K"), (8, "JX"), (10, "QZ")]
def get_scrabble_scorer():
    print {x:y for x,z in scrabble_scores for y in z}
    pass

get_scrabble_scorer()

我希望有一个输出:

[1:'E',1:'A,1:'O',1:'I'....]

这样分数将映射到单词中的每个字母 但我得到了输出:

{1: 'U', 2: 'G', 3: 'P', 4: 'Y', 5: 'K', 8: 'X', 10: 'Z'}

帮帮我

【问题讨论】:

  • 您无法获取 1:'E',1:'A' 。字典的键应该是唯一的。
  • 如果您在字典中切换xy ,它应该可以工作,即:print {y:x for x,z in scrabble_scores for y in z}
  • {"A": 1, "B": 3, "C": 3, "D": 2, "E": 1, "F": 4, "G": 2, "H": 4, "I": 1, "J": 8, "K": 5, "L": 1, "M": 3, "N": 1, "O": 1, "P": 3, "Q": 10, "R": 1, "S": 1, "T": 1, "U": 1, "V": 4, "W": 4, "X": 8, "Y": 4, "Z": 10}
  • 为什么不使用字符作为键呢?似乎对于拼字游戏,您需要更频繁地从字母中查找分数而不是从分数中查找字母。

标签: python loops for-loop nested list-comprehension


【解决方案1】:

您可以将打印命令更改为:

print [{x:y} for x,z in scrabble_scores for y in z]

那么输出将是:

[{1: 'E'}, {1: 'A'}, {1: 'O'}, {1: 'I'}...

【讨论】:

    【解决方案2】:

    列表理解中的逻辑很好。您可以通过更改来验证这一点

    print {x:y for x,z in scrabble_scores for y in z}
    

    print [(x,y) for x,z in scrabble_scores for y in z]
    

    打印出来

    [(1, 'E'), (1, 'A'), (1, 'O'), (1, 'I'), (1, 'N'), (1, 'R'), (1, 'T'), (1, 'L'), (1, 'S'), (1, 'U'), (2, 'D'), (2, 'G'), (3, 'B'), (3, 'C'), (3, 'M'), (3, 'P'), (4, 'F'), (4, 'H'), (4, 'V'), (4, 'W'), (4, 'Y'), (5, 'K'), (8, 'J'), (8, 'X'), (10, 'Q'), (10, 'Z')]
    

    您的实现不起作用的原因是字典的每个键都必须是唯一的。因此,当您设置1:A 时,之前的key:value1:E 将被覆盖。

    也许您正在寻找作为关键的字母?如果是这样,那么只需交换 x 和 y:

    print {y:x for x,z in scrabble_scores for y in z}
    

    【讨论】:

      【解决方案3】:

      你需要切换字典,所以键是字母,值是分数。 Python 中的字典不能有重复的键。

      这也是计算单词分数的方法,通过查找每个字母(而不是查找每个数字)。

      >>> {letter:score for score,letters in scrabble_scores for letter in letters}
      {'A': 1, 'C': 3, 'B': 3, 'E': 1, 'D': 2, 'G': 2, 'F': 4, 'I': 1, 'H': 4, 'K': 5,
       'J': 8, 'M': 3, 'L': 1, 'O': 1, 'N': 1, 'Q': 10, 'P': 3, 'S': 1, 'R': 1, 'U': 1
      , 'T': 1, 'W': 4, 'V': 4, 'Y': 4, 'X': 8, 'Z': 10}
      

      您将如何使用上述映射:

      >>> word = 'hello'
      >>> score = sum(lookup.get(i.upper(),0) for i in word)
      >>> score
      8
      

      【讨论】:

      • 谢谢@BurhanKhalid。但是{x:y..{y:x..有什么区别
      • 键是字母(不重复),值是每个字母的值。 Python 字典不能有重复的键,你不能有 {3: 'C', 3: 'B'}
      【解决方案4】:

      如果您不坚持使用数字键:

      >>> {y:x for x,z in scrabble_scores for y in z}
      {'E': 1, 'M': 3, 'F': 4, 'Z': 10, 'G': 2, 'Q': 10, 'U': 1, 'R': 1, 'I': 1, 'C': 3, 'A': 1, 'K': 5, 'Y': 4, 'L': 1, 'B': 3, 'O': 1, 'D': 2, 'T': 1, 'W': 4, 'S': 1, 'X': 8, 'P': 3, 'H': 4, 'J': 8, 'V': 4, 'N': 1}
      

      你可以用它来计算一个单词的分数:

      >>> score_mapping = {y:x for x,z in scrabble_scores for y in z}
      
      >>> word = 'Hello'
      >>> sum(score_mapping[letter.upper()] for letter in word)
      8
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        相关资源
        最近更新 更多