2017-09-27 50 views
0

什麼是效率最高的如何找到列表中只出現一次的字符串索引?查找Python 3列表中唯一值索引的最有效方法

foo = ['it', 'does', 'it', 'very', 'very', 'well'] 
bar = ??? # bar = [1, 5] 

我已經知道集合,字典和列表解析。我試圖在這裏解決的問題是在我的生產代碼中,我有並行數據列表,其中一個索引是許多索引,因爲歷史原因無法更改索引。

+0

爲什麼近票選爲「太寬泛」?我認爲這是目標明確的問題,目前只有一個很好的答案。 – empty

回答

3

隨着collections.Counter子類:

import collections 

foo = ['it', 'does', 'it', 'very', 'very', 'well'] 
counts = collections.Counter(foo) 
result = [i for i,v in enumerate(foo) if counts[v] == 1] 

print(result) 

輸出:

[1, 5] 
+0

只是好奇:爲什麼你提到它是一個子類?是不是(幾乎)Python中的每個類都是一個子類? –

+0

@EricDuminil,有時,我從文檔中引用:* Counter是一個用於計算可哈希對象的字典子類。*。 (當然,除了最頂層的ABC之外,每個班級都是一個sublcass) – RomanPerekhrest

+0

好的,如果你指定Counter的超類,它肯定是有意義的。好的答案順便說一句。 –

-2

這取決於那種效率您想獲得。你可以直接在列表理解,直接的和可讀的做到這一點:

欄= [指數爲指數,EL在枚舉(富)如果foo.count(EL)== 1]

如果您想使用計數器,請參閱this以瞭解相關信息。計數器

+0

它可讀,但速度慢。注意:我沒有downvote。 –

0

您將得到您想要的結果。字典是Python中更快

from collections import Counter 
foo = ['it', 'does', 'it', 'very', 'very', 'well'] 
d = dict(Counter(foo)) 
[i for i,v in enumerate(foo) if counts[v] == 1] 

您還可以使用設置(富)

+0

櫃檯已經有了答案。另外,這個代碼輸出唯一的單詞,而不是它們的索引。 –

0

你可以嘗試這樣的事情,特別是如果你FOO列表的大小比你上面的例子更大,有很多的重複。

seen = set() 
[i for i,e in enumerate(foo) if not (e in seen or seen.add(e) or e in foo[i+1:])] 
相關問題