首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表理解和处理空列表;列表列表

列表理解和处理空列表;列表列表
EN

Stack Overflow用户
提问于 2018-08-08 00:42:29
回答 3查看 3.1K关注 0票数 2

我正在尝试执行列表理解。我想用较大列表的值检查较小列表中的值。我觉得我的代码行得通。直到我的一个内部列表为空。

逻辑是有道理的..。较小列表的位置0处没有元素,因此索引错误:

代码语言:javascript
复制
['w', 'c']
    if x[0] != y[0]:
['w', 'c']
IndexError: list index out of range

然而,我想知道的是,什么是正确的方式来编写这个s/t它不会在这里出错,而只是假设没有匹配,并转移到list_one中的下一个列表?

下面是我的代码:

代码语言:javascript
复制
a = [['a', 'b', 'c'], ['w', 'c'], []]
b = [['a', 'b', 'c'], ['a', 'f', 'g'], ['x', 'y', 'z']]


def check_contents(list_one, list_two):

  if len(list_one)<=len(list_two):
    for x in list_one:
      for y in list_two:
        if x[0] != y[0]:
          print(x)
  else:
    for x in list_two:
      for y in list_one:
        if x[0] != y[0]:
          print(x)


check_contents(a, b)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-08 00:55:03

首先,你的两个循环做同样的事情。DRY (不要重复自己)。其次,要查看列表是否为空,请检查其真值。空列表求值为False

代码语言:javascript
复制
def check_contents(list_one, list_two):
    shorter, longer = sorted([list_one, list_two], key = len)
    for x in longer:
        if not x:
            continue
        for y in shorter:
            if not y:
                continue
            if x[0] != y[0]:
                print(x)
票数 2
EN

Stack Overflow用户

发布于 2018-08-08 00:48:51

试试这个:

代码语言:javascript
复制
for x, y in zip(list_one, list_two):
    if x and y and x[0] != y[0]:
        print(x)
    else:
        # Rest of the code here

使用zip()函数创建一个zip对象,这样您就可以同时遍历list-onelist-two,并比较它们的元素。这也解决了你的空列表问题。

票数 2
EN

Stack Overflow用户

发布于 2018-08-08 00:51:42

您可以将条件更改为:

代码语言:javascript
复制
if x and x[0] != y[0]:

空列表是假的,而非空列表是真的,因此只有当x为非空(即x[0]存在)时,这才会计算x[0] != y[0]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51731684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档