python basic for loop / list comprehension

时间:2015-10-10 00:41:16

标签: python for-loop list-comprehension

说我有:

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

我想打印一个只有数字的列表,从最小到最大。我试过这样做:

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

但它说'int object不可迭代'?

如果我这样做,它可以工作(输出是:[22,33])

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

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

BTW,最终目标是打印NAME的人将最低分。但是,在将名称与商标联系起来之前,我首先要了解这一部分。通过

,Dict可以更容易地分配键值

2 个答案:

答案 0 :(得分:2)

当你这样做时:

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是一个返回排序列表的函数。为了说明生成器和迭代器(如列表,元组和dicts)之间的区别,请将最后一个片段与下面的代码进行比较:

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元素(第二个元素)。

答案 1 :(得分:2)

因为列表理解会在此处显示生成器,请参阅:

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

然而,sorted()可用于可迭代,如列表生成器,然后将其转换为列表。

例如,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]