我正在学习python并完成谷歌代码课程。在list2.py示例中,他们要求我们编写一个函数:
给定两个以递增顺序排序的列表,创建并返回合并 按排序顺序排列的所有元素的列表。您可以修改传入的列表。 理想情况下,解决方案应该在“线性”时间内工作,制作单个 通过两个名单。
他们给出了代码:
def linear_merge(list1, list2):
result = []
#Look at the two lists so long as both are non-empty.
#Take whichever element [0] is smaller.
while len(list1) and len(list2):
if list1[0] < list2[0]:
result.append(list1.pop(0))
else:
result.append(list2.pop(0))
#Now tack on what's left
result.extend(list1)
result.extend(list2)
return result
我对while循环有疑问。我不确定我是否理解布尔测试是什么以及何时失败并打破循环。谁能帮助我更好地理解这个?
答案 0 :(得分:2)
while len(list1) and len(list2):
这意味着,如果len(list1)
和len(list2)
为True
,换句话说len(list1)>0
和 {{1} },启动len(list2)>0
循环。因此,如果这两个列表在while循环之前都为空,则不会输入循环。
Python值和容器可以用作布尔值(True或False)。如果该值为某种零,或者容器为空,则认为它是while
,否则它是False
。
示例:
True
此外,在Python中,True或False的布尔值可用于算术:False的算术值为零,True的算术值为1。
示例:
>>> a=0
>>> bool(a)
False
>>> a=26
>>> bool(a)
True
>>> a=""
>>> bool(a)
False
>>> a=" " #this has a gap, its not "".Realize that, its different than the last example.
>>> bool(a)
True
>>>
通常情况下,在Python中使用>>> True + True
2
并使用while True:
语句完全脱离循环可能会更好。但这对于if
函数来说并不是必需的。
示例:
linear_merge()
答案 1 :(得分:1)
将其视为
while len(list1)!=0 and len(list2)!=0:
意味着两个列表都是非空的
上述解决方案实际上是错误的,因为list1可能是终止循环的空列表
试试这个:
while len(list1) and len(list2):
if list1[0] < list2[0]:
result.append(list1.pop(0))
else:
result.append(list2.pop(0))
#Now tack on BOTH lists. one or both will be empty, so only the non-empty one will be tacked on
result.extend(list1)
result.extend(list2)
答案 2 :(得分:1)
因此,布尔只检查列表中是否有项目。
所以,例如,假设你有:
list1 = []
现在,此列表没有存储任何内容。所以它的布尔值是假的。您可以通过以下方式测试:
print(bool(len(list1)))
如果是空列表,则会打印出来 假
所以这个while循环要求的是 {/ 1}}和list1
都有项目(因为list2
)。如果其中任何一个为空,则退出循环。
答案 3 :(得分:1)
写下Pythonic而不是:
while len(list1) and len(list2):
此:
while list1 and list2:
它们在语义上都是相同的 - 它们意味着两个列表都有内容继续循环。零和空列表在布尔上下文中测试False
,当列表为空时,它的长度为零。在其他语言中,这就是你如何做到的,但是在Python中,你只需使用if a_list
或while a_list
来检查列表的布尔值。
答案 4 :(得分:1)
以下声明表示:
而len(list1)和len(list2):
如果len(list1)
和len(list2)
,我们只会进入while循环。
现在在python中,True
评估为1
,False
评估为0
,反之亦然:
>>> int(True)
1
>>> int(False)
0
所以基本上只要list1
和list2
的长度都不等于0
,我们就会进入while
循环,因此{{1} }和list1
包含我们以后可能要删除的任何值(预示list2
),然后我们将进入。
.pop()
是一种删除某个索引值的方法,并返回该值:
.pop()
如果>>> _list = ['I', 'am', 'cool']
>>> result = _list.pop(2) #Should return _list[2], hence 'cool', and also remove it from _list
>>> result
'cool'
>>> _list
['I', 'am']
>>>
循环未检查列表中是否包含任何项目,则会收到此错误:
while
您也可以尝试完全删除>>> _list = ['I', 'am', 'cool']
>>> _list.pop(0)
'I'
>>> _list.pop(0)
'am'
>>> _list.pop(0)
'cool'
>>> _list.pop(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop from empty list
>>>
,看看会发生什么:)
希望这有帮助!
答案 5 :(得分:0)
数字被评估为布尔值的方式是0为假,其他每个数字都为真。我相信这就像C和其他一些语言。所以while len(list)
说&#34;而列表的长度不是零&#34;,即&#34;而列表不为空&#34;。