为什么[:1]在for循环中工作,而在python中不工作[0]?

为什么[:1]在for循环中工作,而在python中不工作[0]?,python,tuples,Python,Tuples,我刚才问了一个关于[:1]和[0]之间区别的问题 下面的程序解析文本文档并将所述txt文档中的所有电子邮件地址实例放入字典中,然后从该字典创建元组列表,然后对列表进行排序并打印出实例最多的电子邮件。请阅读本程序的最后2行代码: emails = dict() fname = input('Enter file name: ') try: fhand = open(fname) except: print("sorry can't do that") q

我刚才问了一个关于[:1]和[0]之间区别的问题

下面的程序解析文本文档并将所述txt文档中的所有电子邮件地址实例放入字典中,然后从该字典创建元组列表,然后对列表进行排序并打印出实例最多的电子邮件。请阅读本程序的最后2行代码:

emails = dict()
fname = input('Enter file name: ')
try:
    fhand = open(fname)
except:
    print("sorry can't do that")
    quit()
for line in fhand:
    if not line.startswith("From "):
        continue
    line = line.split()
    emails[line[1]] = emails.get(line[1], 0) + 1
tmp = list()
for k, v in emails.items():
    newtup = (v, k)
    tmp.append(newtup)
tmp = sorted(tmp, reverse = True)
for v, k in tmp[:1]:
    print(k, v)
for v, k in tmp[:1]:
        print(k, v)
具体来说,本程序的最后两行:

emails = dict()
fname = input('Enter file name: ')
try:
    fhand = open(fname)
except:
    print("sorry can't do that")
    quit()
for line in fhand:
    if not line.startswith("From "):
        continue
    line = line.split()
    emails[line[1]] = emails.get(line[1], 0) + 1
tmp = list()
for k, v in emails.items():
    newtup = (v, k)
    tmp.append(newtup)
tmp = sorted(tmp, reverse = True)
for v, k in tmp[:1]:
    print(k, v)
for v, k in tmp[:1]:
        print(k, v)
工作完美。但当我尝试用这种语法做同样的事情时:

for v, k in tmp[0]:
        print(k, v)
我得到以下回溯:

TypeError: cannot unpack non-iterable int object

我猜[0]在某种程度上与[:1]不同?为什么tmp[:1]工作,但tmp[0]不在for循环中

我没有抱怨,因为我的程序使用tmp[:1]语法运行得很好,但是为什么它不能使用tmp[0]语法呢?他们不是一回事吗


谢谢你的时间和阅读,如果你已经走了这么远

嗯,这是一个例子

>>tmp=[1,2,3] >>tmp[:1] [1] >>tmp[0] 1. >>类型[1] 列表 >>类型1 int 如您所见,[:1]和[0]生成不同的内容。[:1]生成列表,[0]返回第一个元素。你为什么不亲自尝试呢

还为您举了一个例子:

>> tmp = [(1,1),(2,2),(3,3)]

>> tmp[:1]
[(1, 1)]

>> tmp[0]
(1, 1)

>> for k,v in [(1, 1)]: pass

>> for k,v in (1, 1): pass
TypeError: cannot unpack non-iterable int object

这样的迭代根本没有意义:对于1,1:.中的k,v.

您需要了解Python列表索引和切片,因为这是两者之间的区别

tmp[:1]: 这是列表切片语法。这种语法的一般形式是这样的

list_object[start_idx: end_index]
这将返回一个切片列表,其中的元素起始于include start_idx,结束于end_idx not inclusive,因此小于此值一个

因此,在您的问题中,tmp[:1]返回一个子列表,该子列表被视为元素为0的iterable。因为这是一个iterable,所以可以在for循环中进行迭代

tmp[0]: 这是列表索引语法。一般形式是,

list_object[element_idex]
这将返回该索引处的元素。返回值可能是/可能不是iterable,这取决于列表的组成。在您的情况下,tmp[0]返回列表的第一个元素。

确定。有道理

>>> tmp = [1, 2, 3]
>>> tmp[0]
1
>>> tmp[:1]
[1]

其中tmp[0]可以是任何对象,比如无法迭代的对象,比如在我的例子中,一个元组。

它们不是同一个对象吗?您是否打印了它们并查看了值?我猜[0]在某种程度上与[:1]**不同。您是否尝试过查看它们的实际功能?另一方面,只需使用max,您不必对整个列表进行排序。列表[0]是列表的第一个元素,并且具有存储在此位置的对象的对象类。它可以是整数、字符串或任何其他类型。如果它不可iterable,则不能对其进行迭代。list[:1]是长度为1的列表,仅包含列表的第一个元素。因为它仍然是一个列表,所以您可以在它上面迭代一个循环。@the23效果。对或者如果它在第一个索引处包含字符串或元组。但它将在该对象上迭代,这可能导致不止一个循环。