python:不理解"而len(list1)和len(list2):"

时间:2014-12-19 03:35:42

标签: python while-loop

我正在学习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循环有疑问。我不确定我是否理解布尔测试是什么以及何时失败并打破循环。谁能帮助我更好地理解这个?

6 个答案:

答案 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_listwhile a_list来检查列表的布尔值。

答案 4 :(得分:1)

以下声明表示:

  

而len(list1)和len(list2):

如果len(list1)len(list2),我们只会进入while循环。

现在在python中,True评估为1False评估为0,反之亦然:

>>> int(True)
1
>>> int(False)
0

所以基本上只要list1list2的长度都不等于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;。