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 上,例如 list 或 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]
假设我有:
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 上,例如 list 或 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]