Sum函数不可迭代

时间:2015-08-24 06:54:24

标签: python

score = {
  'a': 1, 'b': 3, 'c': 3, 'd': 2, 'e': 1, 'f': 4,
  'g': 2, 'h': 4, 'i': 1, 'j': 8, 'k': 10, 'l': 1,
  'm': 2, 'n': 1, 'o': 1, 'p': 3, 'q': 8, 'r': 1,
  's': 1, 't': 1, 'u': 1, 'v': 4, 'w': 10, 'x': 10,
  'y': 10, 'z': 10,
}

x = input('Enter a Word: ')
y = list(x)
a = []
for i in x:
  z = int(score[i])
  a = sum(z)

  print(a)

a= sum(z)继续说它是" int'对象不可迭代"。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

我猜你希望a存储单词中字母的总和。如果是这样,你所做的是错的。 sum()函数需要一个iterable,然后通过添加该iterable的每个元素来获取总和并返回总和。示例 -

>>> sum([1,2,3,4])
10

它不会像你期望的那样工作。

在你的情况下,你甚至不需要使用总和,只需做 -

a = 0   #before the loop

a += z #inside the loop

此外,你应该缩进print a outisde for循环,这样你只打印最后的字母总和。

答案 1 :(得分:1)

如@AdandSKumar的评论@Amadan所述,你可以做以下事情:

a = sum(score[c] for c in x)

假设您还在学习Python,这里是对上述代码的解释。

首先,如@AnandSKumar所述,sum内置函数将参数作为可迭代参数。什么是可迭代的?它是一个实现__iter__方法的对象,它允许迭代对象的数据。最好的例子是list对象。请考虑以下代码:

my_list = ['a', 'b', 'c']
try:
    while True:
        print next(my_list)
except StopIteration:
    print "The end."

# Result :
a
b
c
The end.

我们遍历列表my_listsum函数可能/在Python实现中看起来像这样:

def sum(iterable):
    iterator = iter(iterable)
    result = next(iterator, 0)
    try:
        while True:
            result += next(iterator)
    except StopIteration:
        pass
    return result

您正在做的事情的一个很好的例子可能是创建一个列表如下,总和:

a = [score[c] for c in x]
print sum(a)

# Equivalent code (one liner) :
print sum([score[c] for c in x])

# Equivalent code :
a = []
for c in x:
    a.append(c)

print sum(a)

问题是你完全生成了你的列表a并且需要内存。 @Amadan所说的是使用generator expression动态生成列表a。我们的想法是创建一个可迭代的,它在内存中没有任何表示。

print sum(score[c] for c in x)

# Equivalent code :
result = 0
for c in x:
    result += score[c]
print result

这样的内存效率更高,看起来你是Python之神:)

你想要做的一件事:

# Python 3
print sum(score[c] for c in input("Enter a word: "))

# Python 2
print sum(score[c] for c in raw_input("Enter a word: "))