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

Reb*_*oel 2 python indexing tuples python-2.7

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
Run Code Online (Sandbox Code Playgroud)

有问题的部分是:

for key, val in lst[0]:
    print key, val
Run Code Online (Sandbox Code Playgroud)

这给了我:TypeError:'int'对象不可迭代.我已经发现,由于某种原因,这确实有效:

输入:

for key, val in lst[:1]:
    print key, val
Run Code Online (Sandbox Code Playgroud)

输出:

Enter a file name: mbox-short.txt
5 cwen@iupui.edu
Run Code Online (Sandbox Code Playgroud)

我只想弄清楚为什么这个有效但不是[0].和往常一样,谢谢你的帮助!

sty*_*ybl 5

你必须认识之间的差异[0][:1]

什么[0]是返回存储在列表的索引0处的值.

另一方面,当你这样做时[:1],你正在切割列表,这意味着你得到的列表中的所有元素的索引从0(含)到1(不包括).

文档:

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

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

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

对于一个简单的解释,看到这个伟大的答案由格雷格Hewgill名录切片是如何工作的.