Python:打印不在单独索引列表中的列表项



我有两个列表:
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']

最新更新