python loop/list 理解的基础

python basic for loop/list comprehension

假设我有:

list=[('mike', 22.0), ('john', 33.0)]

我想打印一个仅包含数字(从小到大)的列表。我试过这样做:

for s in list:
    print(sorted(s[1]))

但是它说 'int object is not iterable'?

如果我这样做,它会起作用(输出是:[22,33])

print (sorted(s[1] for s in list))

第二次尝试是如何工作的,第一次尝试和第二次尝试有什么区别?很难理解列表理解技术。

顺便说一句,最终的目标是打印人的姓名,将获得最低分。但是在将名称与标记相关联之前,我试图先了解这一部分。 Dict 将使分配键值变得容易得多

当你这样做时:

for s in list:
    print(sorted(s[1]))

您正在尝试对 int 进行排序。 sorted 函数需要一个 iterable(例如,一个列表)。因此你的错误。这是值得注意的,因为:

for s in list:
    print(s[1])

打印:

22.0
33.0

另一方面,当您执行以下操作时:Sorted(s[1] for s in myList),您正在对列表进行排序(实际上您正在对生成器进行排序,但有一条细线)。尝试:

newList = [s[1] for s in myList]
newList

您会发现实际上是在对列表进行排序。对列表进行排序是有意义的,但对单个数字进行排序则没有意义。 Sorted 是一个 returns 排序列表的函数。为了说明生成器和可迭代对象(如列表、元组和字典)之间的区别,请将最后一个片段与以下片段进行比较:

newGenerator = (s[1] for s in myList)
print(newGenerator) #probably won't give what you ever need
for item in newGenerator:
    print item  #this will iterate through the items in the generator and print them

我以为您希望对群组进行排序,但其他人已经回答了这个问题并被否决了,所以我没有添加它。以下是您将如何做到这一点:

myList.sort(key = lambda x: x[1])

然后:

myList[0][0]

将是最低人的名字。

在这种情况下,sort 是一种方法,它对 myList 进行操作并对其进行更改。如果您将 key = lambda x: x[1] 参数传递给它,它将根据位置 1 对列表进行排序。所以,如果你的数字在你的元组中处于不同的位置,你会在那里使用不同的数字。 lambda 只是一种动态创建函数的方法,在这种情况下,函数只是获取 1 元素(第二个元素)。

因为列表理解会在这里给出一个生成器,参见:

>>> Mylist=[('john', 33.0),('mike', 22.0)]
>>> print(s[1] for s in Mylist)
<generator object <genexpr> at 0x7fd4a005e0f8>

但是,sorted() 可以用在 iterable 上,例如 listgenerator,然后将其转换为列表。

例如,range() 将在 Python 3 上提供 生成器 (如果您使用的是 Python 2,请使用 xrange() 代替):

>>> a = range(20)
>>> sorted(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

以及为什么这个列表理解给出了一个生成器,我想你忘记了[]

>>> Mylist=[('john', 33.0),('mike', 22.0)]
>>> print(sorted([s[1] for s in Mylist]))
[22.0, 33.0]
>>> print(sorted(s[1] for s in Mylist))
[22.0, 33.0]
>>> print([s[1] for s in Mylist])
[33.0, 22.0]
>>> print(s[1] for s in Mylist)
<generator object <genexpr> at 0x7f8ab881c6d0>
>>> 

顺便说一句,关于你的没有列表理解的代码:

>>> Mylist=[('john', 33.0),('mike', 22.0)]
>>> l = []

>>> for s in sorted(Mylist, key=lambda x:x[1]):
...     l.append(s[1])

>>> print(l)
[22.0, 33.0]