【问题标题】:How to iterate over a string and for each letter, if it is in a dictionary (key), add values to a new list?如何遍历字符串并为每个字母,如果它在字典(键)中,将值添加到新列表中?
【发布时间】:2019-07-15 05:42:57
【问题描述】:

如果该字母在给定的字典中(作为键),我会写什么来迭代字符串和每个字母,然后将该键的值添加到空列表中?

例如字符串“cat”,我想在给定的字典中搜索 c、a 和 t。然后对于每个字母的每个值,将它们添加到一个新列表中,该列表是点(值)的总和。

我不断收到:TypeError: 'NoneType' object is not iterable

这是我目前所拥有的:

user_word = cat

values_dict = {'A' : 1, 'E' : 1, 'I' : 1, 'O' : 1, 'U' : 1, 'L' : 1,\
              'N' : 1, 'N' : 1, 'S' : 1, 'T' : 1, 'R' : 1,\
              'D' : 2, 'G' : 2, 'B' : 3, 'C' : 3, 'M' : 3, 'P' : 3,\
              'F' : 4, 'H' : 4, 'V' : 4, 'W' : 4, 'Y' : 4,\
              'K' : 5, 'J' : 8, 'X' : 8, 'Q' : 10, 'Z' : 10,}

def get_word_value(user_word, values_dict):
    word_pts = 0

    for letter in user_word.upper():
        for key, value in values_dict.items:
            for letter in range(value):
                word_pts = word_pts + values_dict[letter]

                print(word_pts, 'TEST GOOD')
    return word_pts

# expected result is 5 (3+1+1= 5)

【问题讨论】:

  • 首先,您需要使用for key, value in values_dict.items() - 所以values_dict.items() 必须作为方法调用。然后,for letter in range(value) 我猜是不正确的,因为value 是标量(它是字典中的值,您可以对其进行迭代)...

标签: python string loops dictionary key-value


【解决方案1】:

TypeError: 'NoneType' object is not iterable 是由于线路 for key, value in values_dict.items:.

dict.items 是一个函数,而不是一个可迭代的。要访问实际值,请使用括号遍历键和值:for key, value in values_dict.items():

【讨论】:

  • 嗯,我现在收到 AttributeError: 'NoneType' object has no attribute 'items'
  • 那个错字应该会导致像TypeError: 'builtin_function_or_method' object is not iterable这样的错误。我认为 OP 一定是在某个时候写过 for key, value in values_dict: 并且在更改代码后没有更新他们的错误消息。
【解决方案2】:

这是一个单行:

sum([values_dict[letter] for letter in user_word.upper()])

【讨论】:

  • 谢谢!现在我收到 TypeError: 'NoneType' object is not subscriptable
  • 如果 values_dict 为 None 将被抛出。你确定你初始化正确吗?如果您仍然遇到问题,请使用您尝试过的代码更新问题。
  • 是的!你是救生员,非常感谢你。你是对的,我代码中的字典存储在一个函数中,就像一个白痴一样,我忘记在那个函数中写 return values_dict 所以我认为它没有像你说的那样正确初始化。你太棒了
【解决方案3】:

这里是您更正的代码:

    user_word = "cat"

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


    def get_word_value(user_word, values_dict):
        word_pts = 0

        for letter in user_word.upper():
            for key, value in zip(values_dict.keys(), values_dict.values()):
                if letter == key:
                    word_pts += value

        print('Word pts : {} , TEST GOOD'.format(word_pts))
        return word_pts

【讨论】:

  • 谢谢!有了这个,我在打印功能的末尾得到了突出显示的红色框并且它没有运行? “unindent 不匹配任何外部缩进级别”
  • 好的,这取决于您拥有的 python 版本,但请尝试将 {} 更改为 {0}。也许这会有所帮助:docs.python.org/3/library/string.html#formatstrings
【解决方案4】:

我建议你使用

sum([values_dict.get(letter, 0) for letter in user_word.upper()])

如果找不到密钥,这将避免错误。

【讨论】:

  • 允许它引发 KeyError 可能会更好。它确保user_word 仅包含字母,并且字典具有完整的字母表。
【解决方案5】:
user_input = raw_input("Enter Your Word: ")
user_input = user_input.upper()
wordArray = list(user_input)

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

def get_word_value(wordArray, values_dict):
    word_pts = 0
    for letter in wordArray:
        word_pts = word_pts + values_dict[letter]

    print "Word Points: %d, Test Good." % word_pts
get_word_value(wordArray, values_dict)

【讨论】:

    【解决方案6】:

    您可以使用运算符itemgetter()。它比列表理解更快:

    from operator import itemgetter
    
    d = {'A': 1, 'T': 1, 'C': 3, 'E': 1}
    
    w = 'cat'
    sum(itemgetter(*w.upper())(d))
    # 5
    

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 2014-09-05
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多