我有两个列表:list = ["a","b","c","d"]
i_to_skip = [0,2]
除了i_to_skip
中的索引外,我想打印list
中的所有内容。我尝试了以下操作,它只返回一个生成器对象:
print(x for x in list if x not in i_to_skip)
您的理解之所以有效,是因为x
是值,就像"a"
,而不是索引(就像0
),当然"a"
不在[0, 2]
中。
要获得索引和值,您需要enumerate
。然后你可以这样做:
print([x for i, x in enumerate(list) if i not in i_to_skip])
另外,请注意,打印生成器表达式(就像您所做的那样)只会打印类似<generator object <genexpr> at 0x1055fd8b8>
的内容;这就是为什么我将您的代码转换为打印列表理解,所以您得到的是['b', 'd']
。
如果你想打印,比如说,一次打印一行,你可以在生成器表达式上循环:
for x in (x for i, x in enumerate(list) if i not in i_to_skip):
print(x)
但实际上,把它分解成一个单独的循环更容易:
for i, x in emumerate(list):
if i not in i_to_skip:
print(x)
或者,更简单的是,将整个内容格式化为一个表达式,可能是这样的:
print('n'.join(x for i, x in enumerate(list) if i not in i_to_skip))
……甚至让print
为您做这件事:
print(*(x for i, x in enumerate(list) if i not in i_to_skip), sep='n')
最后,顺便提一下,将您的列表称为list
是个坏主意;它隐藏了以后可能要使用的类型/构造函数,还会使代码产生误导。
mylist = ["a","b","c","d"]
print([x for i,x in enumerate(mylist) if i not in i_to_skip])
您不应该将列表称为list
,或者您正在隐藏list
类型本身。
enumerate
将为您提供列表的索引和相应元素。
将理解放在方括号中可以将其放入列表中,这比生成器更容易打印。
您的打印结果是生成器,您需要将您的列表理解放入列表符号([]
)或使用list()
函数,你还需要检查索引而不是值,所以你可以用enumerate()
:来计算
>>> print ([j for i,j in enumerate(list) if i not in i_to_skip] )
['b', 'd']