2014-10-29 65 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