2014-10-29 47 views
1

我将下面的代码作为两个列表解析,但我想要一种方法,我只需要在edges之间迭代一次。在python列表中查找两个不同组的索引到两个列表中

 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"] 

我可以用非常不Python的循环做了edges和具有两个预初始化列表把x与两个if语句,但我想知道是否有做Python的/漂亮的方式这个。

+2

我不会说两个预先初始化的列表完全是非pythonic ...它是完全可读的......除非'enumerate(edges)'昂贵或具有副作用(例如,边缘可能是一个生成器),否则它是完全可读的...... – 2014-10-29 21:03:00

+0

。 ,我认为更容易看出这两种理解发生了什么,所以我可能会用这个 – 2014-10-29 21:15:50

+1

什么时候循环和'if'语句变成非pythonic?如果事情简单明了,可以理解,Pythonic就是非常高的机会。 – 2014-10-29 21:26:25

回答

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) 
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', [])以获得空l非现值的价值。

+0

+1,字典会更合适 – 2014-10-29 21:23:33