说我有:
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可以更容易地分配键值答案 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]