fhand = open(raw_input('Enter a file name: '))
counts = dict()
words = []
for lines in fhand:
if lines.startswith('From') and not lines.startswith('From:'):
words = lines.split()
if words[1] not in counts:
counts[words[1]] = 1
else:
counts[words[1]] += 1
lst = list()
for key, val in counts.items():
lst.append((val, key))
lst.sort(reverse=True)
for key, val in lst[0]:
print key, val
有问题的部分是:
for key, val in lst[0]:
print key, val
这给了我:TypeError:' int'对象不可迭代。我已经发现,由于某些原因,这确实有效:
输入:
for key, val in lst[:1]:
print key, val
输出:
Enter a file name: mbox-short.txt
5 cwen@iupui.edu
我只想弄清楚为什么这个有效但不是[0]。和往常一样,谢谢你的帮助!
答案 0 :(得分:5)
您必须意识到SELECT Team, Counselling_Status AS counsellingTeamStatus
FROM Team_Counselling
WHERE Counselling_Status IN ('In Progress','Completed')
GROUP BY Team;
和[0]
[:1]
的作用是返回存储在列表索引0处的值。
另一方面,当您执行[0]
时,您切片列表,这意味着您将获得列表中所有元素的索引从0(含)到最高1(不包括在内)。
所有切片操作都返回包含所请求元素的新列表。
因此,当您对列表进行切片时,您也会返回列表。作为可迭代类型的列表可以被重复使用!即使它们只包含一个元素,也是如此。
执行[:1]
时,您尝试迭代单个值,即for key, val in lst[0]
中索引0处存储的值。但是,当您执行lst
而不是[0]时,返回的不是单个值,而是值的范围。在您的情况下,它可能只包含一个值,但它仍然是一个范围,因此可以在[:1]
循环中迭代。
有关更简单的说明,请参阅this关于列表切片如何工作的Greg Hewgill的最佳答案。
答案 1 :(得分:4)
考虑类似的事情:
lst = [1, 2, 3]
lst[0]
是int
(1
),int
不可迭代。但是,lst[:1]
是另一个list
,因此 可迭代。
在您的情况下,您有一个2元组的列表。所以lst[0]
是一个2元组 - 这是可迭代的。但是,迭代2元组将为您提供不可迭代的单个项目,因此无法解压缩到key, val
。另一方面,lst[:1]
为您提供了一个包含2元组的新列表。可以迭代该列表,然后将<2>元组 解压缩到key
/ value
对。
答案 2 :(得分:3)
UIAlertViewController
返回一个对象,索引为0的元素,但for循环语法需要一些像对象列表一样可迭代的东西。
list[0]
将列表切割成一个新列表,其中只包含第一个元素,因此它可以正常工作。