[英]python basic for loop/list comprehension
说我有:
list=[('mike', 22.0), ('john', 33.0)]
我只想打印一个数字列表,从最小到最大。 我尝试这样做:
for s in list:
print(sorted(s[1]))
但是它说“ int对象是不可迭代的”?
如果我这样做,它将起作用(输出为:[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
是一个返回排序列表的函数。 为了说明生成器和可迭代器(如列表,元组和字典)之间的区别,请将最后一个代码段与以下内容进行比较:
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()
可以用于可迭代的 列表或generator ,然后将其转换为列表。
例如, 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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.