![](/img/trans.png)
[英]How to remove an element that appears more than once in a list without changing the length of the list (no sets)
[英]Remove all occurrences of item(s) in list if it appears more than once
我需要編碼挑戰的幫助,該挑戰要求刪除列表中出現多次的所有項目。 我的代碼僅刪除了一次。 它不會完全刪除該項目。
def solution(data, n):
for x in data:
while data.count(x) > 1:
data.remove(x)
continue
print(data)
solution([1, 2, 2, 3, 3, 4, 5, 5], 1)
expected result: [1, 4]
actual restult: [1, 2, 3, 4, 5]
您可以使用collections.Counter來計數data
中每個元素的所有實例,然后根據此計數僅打印相關的實例:
from collections import Counter
def solution(data, n):
histogram = Counter(data)
print([d for d in data if histogram[d] <= n])
solution([1, 2, 2, 3, 3, 4, 5, 5], 1)
或者直接使用data.count()
:
def solution(data, n):
print([d for d in data if data.count(d) <= n])
solution([1, 2, 2, 3, 3, 4, 5, 5], 1)
由於這是一個編碼挑戰,因此最好不要依賴於Python特定的東西,例如collections
或count()
函數。
通常,您可以使用哈希表以任何一種語言來執行此操作,哈希表在Python中只是一個字典。
我假設參數n
的存在是為了使閾值超過該閾值,您可以刪除該數字,而不是簡單地將其硬編碼為1。
data = [1, 2, 2, 3, 3, 4, 5, 5]
def solution(data, n):
occurrences = {}
# count occurrences
for item in data:
occurrences[item] = occurrences.get(item, 0) + 1
# return trimmed data
trimmed_data = []
for item in data:
if occurrences[item] <= n:
trimmed_data.append(item)
return trimmed_data
solution(data, 1)
產量[1, 4]
這具有O(n)時間復雜度。
您可以通過重復使用第一個列表來保存第二個列表:
def solution(data, n):
occurrences = {}
# count occurrences
for item in data:
occurrences[item] = occurrences.get(item, 0) + 1
# return trimmed data
data.clear()
for k, v in occurrences.items():
if v <= n:
data.append(k)
return data
您可以這樣做:
def solution(data, n):
for x in set(data):
if data.count(x) > n:
while x in data:
data.remove(x)
return data
一些解釋:
set(data)
使得每個值僅被檢查一次,即使它在data
多次出現; continue
語句,它不會執行您可能希望執行的操作; if
語句和while
語句在做什么; n
沒有使用的說法,我認為它應該更換1
中if
直插式。 更新:這是單行版本!
solution = lambda data, n: [x for x in set(data) if data.count(x) <= n]
您可以像以前一樣調用解決方案函數。 如果您對此語法感到困惑,則可以搜索“ python list comprehensions”和“ python lambda”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.