我有一个清单:
[1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1]
我想打印列表中所有值大于2的元素,同时也打印列表中的位置,我可以自己打印元素:
for bonds in number_of_bonds:
if bonds >= 2:
print bonds
但是如果我使用枚举,它将打印列表中的所有项目及其位置,如下所示:
(0, 1)
(1, 1)
(2, 3)
等等
那么正确的做法是什么呢?
对于你的问题你可以做
[(i, j) for i,j in enumerate(l) if j > 2]
输出:
[(2, 3),
(3, 3),
(4, 3),
(5, 3),
(6, 3),
(7, 3),
(8, 3),
(9, 3),
(10, 3),
(11, 3),
(12, 3),
(13, 3),
(14, 3),
(15, 3)]
lst = [1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1]
print [(i, e) for (i, e) in enumerate(lst) if e > 2]
[(2, 3),
(3, 3),
(4, 3),
(5, 3),
(6, 3),
(7, 3),
(8, 3),
(9, 3),
(10, 3),
(11, 3),
(12, 3),
(13, 3),
(14, 3),
(15, 3)]
如果您的列表很大,更好的方法是通过 ()
使用
generator动态生成每个元素,而不是在内存中一次性生成所有元素:
result = ((i, e) for (i, e) in enumerate(lst) if e > 2)
for i in result:
print i
那么输出将是:
(2, 3)
(3, 3)
(4, 3)
(5, 3)
(6, 3)
(7, 3)
(8, 3)
(9, 3)
(10, 3)
(11, 3)
(12, 3)
(13, 3)
(14, 3)
(15, 3)
请注意,生成器只能读取一次,这意味着如果您再次循环
result
,则不会打印任何内容。
你可以添加一个变量 i,每次循环再次开始时它都会计数 +1。
i = 0
for bonds in number_of_bonds:
if bonds >= 2:
print bonds
print i
i += 1
for i in range(len(number_of_bonds)):
if number_of_bonds[i] >= 2:
print i, number_of_bonds[i]
为什么不在 for 循环中使用计数器
因此,如果您想打印original列表中的位置(之前进行任何过滤),这就是我认为您想要做的,那么首先枚举项目,然后对于每个项目,过滤掉那些不感兴趣的。否则,如果您想打印新过滤列表中元素的位置,那么 kunev 答案是正确的。 这是我的意思的代码:
for i,bond in enumerate(number_of_bonds):
if bond >=2:
print (i,bond)
lst = [1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1]
print [(i, e) for (i, e) in enumerate(lst) if e > 2]
抱歉之前我是用 c 语言写的。
答案已删除,因为我确信开放人工智能在没有我帮助的情况下也能很好地吞噬世界。