回答
lst.count(1)
會返回它發生的次數。如果你打算列表中的項目,O(n)就是你將要得到的。
列表上的一般功能是list.count(x)
,並且將返回在列表中發生的次數x
。
+1 - 太快:) – 2010-12-15 03:20:49
你問清單中的每一件物品是否都是唯一的?
len(set(lst)) == len(lst)
是否1
發生多次?
lst.count(1) > 1
注意,上面是不是最高效的,因爲它不會短路 - 即使1
出現兩次,它仍然會算髮生的其餘部分。如果你想讓它短路,你將不得不寫一些更復雜的東西。
第一個元素是否出現多次?
lst[0] in lst[1:]
每個元素出現的頻率?
import collections
collections.Counter(lst)
還有其他嗎?
+1對於collections.Counter和一些好的想法。切片製作整個列表的副本。使用itertools.islice(lst,1,None)只會遍歷它並發現短路。 – kevpie 2010-12-15 03:41:16
def valCount(lst):
res = {}
for v in lst:
try:
res[v] += 1
except KeyError:
res[v] = 1
return res
u = [ x for x,y in valCount(lst).iteritems() if y > 1 ]
u現在是所有值出現多次的列表。
編輯:
@katrielalex:謝謝你指出collections.Counter,而我以前沒有意識到。它也可以使用collections.defaultdict更簡潔地編寫,如以下測試中所演示的。這三種方法大致都是O(n),並且在運行時性能上相當接近(使用collections.defaultdict實際上比collections.Counter稍快)。
我的意圖是對似乎相對不成熟的請求給出一個易於理解的迴應。鑑於此,是否還有其他感覺,認爲它是「糟糕的代碼」或「做得不好」?
import collections
import random
import time
def test1(lst):
res = {}
for v in lst:
try:
res[v] += 1
except KeyError:
res[v] = 1
return res
def test2(lst):
res = collections.defaultdict(lambda: 0)
for v in lst:
res[v] += 1
return res
def test3(lst):
return collections.Counter(lst)
def rndLst(lstLen):
r = random.randint
return [r(0,lstLen) for i in xrange(lstLen)]
def timeFn(fn, *args):
st = time.clock()
res = fn(*args)
return time.clock() - st
def main():
reps = 5000
res = []
tests = [test1, test2, test3]
for t in xrange(reps):
lstLen = random.randint(10,50000)
lst = rndLst(lstLen)
res.append([lstLen] + [timeFn(fn, lst) for fn in tests])
res.sort()
return res
並且結果,對於包含多達50000項隨機列表,如下: (垂直軸是時間(秒),橫軸是在列表中的項目的數目)
這是不好的代碼:你不僅複製'collections.Counter',你做得不好。 – katrielalex 2010-12-15 03:34:08
-1除外。 – 2010-12-15 03:57:24
的另一種方式吃出出現一次以上的所有項目:
lst = [1,2,3,4,1]
d = {}
for x in lst:
d[x] = x in d
print d[1] # True
print d[2] # False
print [x for x in d if d[x]] # [1]
爲多發,這給你每種情況的指標:
>>> lst=[1,2,3,4,5,1]
>>> tgt=1
>>> found=[]
>>> for index, suspect in enumerate(lst):
... if(tgt==suspect):
... found.append(index)
...
>>> print len(found), "found at index:",", ".join(map(str,found))
2 found at index: 0, 5
如果希望每個項目在列表中的計數:
>>> lst=[1,2,3,4,5,2,2,1,5,5,5,5,6]
>>> count={}
>>> for item in lst:
... count[item]=lst.count(item)
...
>>> count
{1: 2, 2: 3, 3: 1, 4: 1, 5: 5, 6: 1}
您也可以對列表進行排序是O(N *的log(n)),然後檢查相鄰的元素平等,這是O(n)。結果是O(n * log(n))。這有一個缺點,就是要求在發現重複數據時可能要保釋的情況下對整個列表進行排序。
對於一個相對罕見的重複列表的大列表,這可能是關於你可以做的最好的。處理這個問題的最好方法確實取決於所涉及的數據的大小及其性質。
- 1. VBA:根據其他列的值查找出現次數
- 2. 計算列表python中出現次數
- 3. 根據一定的標準檢查連續值出現的次數
- 4. 根據另一列計算值的出現次數
- 5. 查找列表中列表中出現次數最多的對
- 6. 檢查一個數字在python字典中出現的次數?
- 7. Python:列出列表中的現有值
- 8. 在重複值列表中查找首次出現的值
- 9. SQL - 根據行中值的出現查找列名稱
- 10. R根據值列表正確檢查提供的參數?
- 11. 如何計算數據幀的列中出現值的次數?
- 12. SQL:從出現最少次數的列中檢索值
- 13. R中列表的出現次數
- 14. 根據標準計算出現次數
- 15. 根據出現次數更改css
- 16. 根據出現次數篩選RDD
- 17. 使用Python計算出現在列表中的單詞的出現次數
- 18. Python - 計算列表中某些範圍的出現次數
- 19. 查找特定值的出現次數
- 20. 查找出現次數最多的值
- 21. 查找特定值的出現次數
- 22. Pandas DataFrame:根據對現有列的值檢查將值寫入列
- 23. 檢查列表中的複選框,根據列表項
- 24. 繪製列值的出現次數
- 25. 在Python中查找數組中整數出現的次數
- 26. 如何根據出現次數對值進行分組
- 27. 數出現在最出現Python列表和返回值與量
- 28. 按列表行中列出的字的出現次數linq
- 29. 返回列表的最大值和出現次數的函數
- 30. 根據值的計數排列列表
你的問題有點模糊(或者也許太具體)。你是否在尋找任何,全部或第一個不是唯一的列表?任何發生超過一次的事情?事實上,1是名單中的第一件重要的事情?解釋爲什麼你想知道這可能也有幫助。 – martineau 2010-12-15 09:29:26