我有两个清单:
list = ["a","b","c","d"]
i_to_skip = [0,2]
除了list
中的索引外,我想在i_to_skip
中打印所有内容。我尝试过以下操作,它只返回一个生成器对象:
print(x for x in list if x not in i_to_skip)
答案 0 :(得分:3)
您的理解能够发挥作用的原因是x
是值,如"a"
,而不是索引,例如{{1} },当然0
不在"a"
。
要获取索引以及值,您需要enumerate
。然后你可以这样做:
[0, 2]
另外,请注意,打印生成器表达式(正如您所做的)只是打印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')
是一个坏主意;它隐藏了类型/构造函数,它可能希望稍后使用,它也会使你的代码产生误导。
答案 1 :(得分:2)
您的打印结果是生成器,您需要将列表理解放在列表符号([]
)或使用list()
函数中,
您还需要检查索引而不是值,因此您可以使用enumerate()
:
>>> print ([j for i,j in enumerate(list) if i not in i_to_skip] )
['b', 'd']
答案 2 :(得分:2)
mylist = ["a","b","c","d"]
print([x for i,x in enumerate(mylist) if i not in i_to_skip])
您不应该调用列表list
,也不要隐藏list
类型本身。
enumerate
将为您提供列表的索引和相应元素。
将理解放在方括号中使其成为一个列表,比生成器更容易打印。