1

我有一个清单:

[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

但是,如果我使用 enumerate 它将代替打印列表中的所有项目及其位置,如下所示:

(0, 1)
(1, 1)
(2, 3)

ETC

那么正确的方法是什么?

4

8 回答 8

6

对于你的问题,你可以做

[(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)]
于 2013-03-05T11:16:22.417 回答
5
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)]

如果您的列表很大,更好的方法是使用生成器通过动态()生成每个元素,而不是在内存中一次生成所有元素:

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再次循环,则不会打印任何内容。

于 2013-03-05T11:17:43.623 回答
0

您可以只添加一个变量 i,每次循环再次开始时都会计数 +1。

i = 0
for bonds in number_of_bonds:       
     if bonds >= 2:
     print bonds
     print i
     i += 1
于 2013-03-05T11:20:11.323 回答
0
for i in range(len(number_of_bonds)):
    if number_of_bonds[i] >= 2:
        print i, number_of_bonds[i]

为什么不在 for 循环中使用计数器

于 2013-03-05T11:21:11.210 回答
0

因此,如果您想打印原始列表中的位置(之前进行任何过滤),这是我认为您想要做的,那么首先枚举项目然后,对于每个项目,过滤掉那些不感兴趣的。否则,如果您想打印元素在新过滤列表中的位置,那么 kunev 答案是正确的。这是我的意思的代码:

for i,bond in enumerate(number_of_bonds):
    if bond >=2:
        print (i,bond)
于 2013-03-05T11:25:33.963 回答
0
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 语言写的。

于 2013-03-05T11:17:58.150 回答
0

对清单做一个理解

interesting_bonds = [index, bonds for index, bonds in enumerate(number_of_bonds) if bonds > 2]
for bonds in interesting_bonds:
    print bonds

列表推导是获取您感兴趣的元素的更“pythonic”的方式。您也可以使用内置的filter.

编辑:正如乔恩在下面的评论中指出的那样,过滤后的枚举不会从原始列表中给出正确的索引。因此,只需对枚举列表进行理解即可。

于 2013-03-05T11:18:32.790 回答
0

功能风格:

filter(lambda (a,b): b >= 2, enumerate(L))

结果:

[(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)]

这使用enumeratefunctionfilterfunction

于 2013-03-05T11:23:45.553 回答