索引打印元组[:1]有效,但[0]产生TypeError

时间:2017-05-16 19:57:01

标签: python python-2.7 indexing tuples

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]。和往常一样,谢谢你的帮助!

3 个答案:

答案 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(不包括在内)。

来自documentation

  

所有切片操作都返回包含所请求元素的新列表。

因此,当您对列表进行切片时,您也会返回列表。作为可迭代类型的列表可以被重复使用!即使它们只包含一个元素,也是如此。

执行[:1]时,您尝试迭代单个值,即for key, val in lst[0]中索引0处存储的值。但是,当您执行lst而不是[0]时,返回的不是单个值,而是值的范围。在您的情况下,它可能只包含一个值,但它仍然是一个范围,因此可以在[:1]循环中迭代。

有关更简单的说明,请参阅this关于列表切片如何工作的Greg Hewgill的最佳答案。

答案 1 :(得分:4)

考虑类似的事情:

lst = [1, 2, 3]

lst[0]int1),int不可迭代。但是,lst[:1] 是另一个list ,因此 可迭代。

在您的情况下,您有一个2元组的列表。所以lst[0]是一个2元组 - 这是可迭代的。但是,迭代2元组将为您提供不可迭代的单个项目,因此无法解压缩到key, val。另一方面,lst[:1]为您提供了一个包含2元组的新列表。可以迭代该列表,然后将<2>元组 解压缩到key / value对。

答案 2 :(得分:3)

UIAlertViewController返回一个对象,索引为0的元素,但for循环语法需要一些像对象列表一样可迭代的东西。

list[0]将列表切割成一个新列表,其中只包含第一个元素,因此它可以正常工作。