我正在尝试执行列表理解。我想用较大列表的值检查较小列表中的值。我认为我的代码有效。直到我的内部列表之一为空。
逻辑很合理...较小列表的位置0没有元素,因此索引错误:
['w', 'c']
if x[0] != y[0]:
['w', 'c']
IndexError: list index out of range
但是,我想知道什么是写此s / t的正确方法,这里不会出错,而只是假设没有匹配项并移至list_one中的下一个列表?
这是我的代码:
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)
答案 0 :(得分:2)
尝试一下:
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-one
和list-two
并比较它们的元素。这也可以解决您的空列表问题。
答案 1 :(得分:2)
首先,您的两个循环执行相同的操作。干(不要重复自己)。其次,要查看列表是否为空,请检查其真值。空列表的值为False
。
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 :(得分:1)
您可以将条件更改为此:
if x and x[0] != y[0]:
空列表是虚假的,非空列表是真实的,因此,如果x不为空(即x[0] != y[0]
存在),则此列表仅计算x[0]
。