繁体   English   中英

循环/列表理解的python基本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM