我将下面的代码作为两个列表推导,但我想要一种方法,我只需要迭代edges
一次。
out_indices = [x for x, (p, d) in enumerate(edges) if d == "O"]
in_indices = [x for x, (p, d) in enumerate(edges) if d == "I"]
我可以在edges
上使用非pythonic循环并使用两个预先初始化的列表将x
放入两个if语句中,但我想知道是否存在pythonic /更漂亮的方式。
答案 0 :(得分:4)
不,你必须做你想要避免的事情(顺便说一下,根本不是非pythonic)。想一想 - 如果你想在一次迭代中做到这一点,你必须有条件地追加到任何明显不适用于理解的列表中:
out_indices = []
in_indices = []
for x, (p, d) in enumerate(edges):
if d == 'O':
out_indices.append(x)
elif d == 'I':
in_indices.append(x)
答案 1 :(得分:3)
对于两个,我只是初始化空列表,但是,如果你有很多,最好存储在dict
中,例如:
data = 'OIIIOIIOOOIOOO'
d = {}
for i, v in enumerate(data):
d.setdefault(v, []).append(i)
# {'I': [1, 2, 3, 5, 6, 10], 'O': [0, 4, 7, 8, 9, 11, 12, 13]}
然后通过d['I']
或d['O']
进行访问,或者如果无法保证其存在,请使用d.get('I', [])
或d.get('O', [])
获取非现有值的空列表。< / p>