Delete occurrences of an element if it occurs more than n times

Delete occurrences of an element if it occurs more than n times

Phan Nhật Chánh

Chánh13 tháng 10, 2020

2 min read
·
views
·
likes

Enough is enough!

Alice and Bob were on a holiday. Both of them took many pictures of the places they've been, and now they want to show Charlie their entire collection. However, Charlie doesn't like these sessions, since the motive usually repeats. He isn't fond of seeing the Eiffel tower 40 times. He tells them that he will only sit during the session if they show the same motive at most N times. Luckily, Alice and Bob are able to encode the motive as a number. Can you help them to remove numbers such that their list contains each number only up to N times, without changing the order?

Task

Given a list lst and a number N, create a new list that contains each number of lst at most N times without reordering. For example if N = 2, and the input is [1,2,3,1,2,1,2,3], you take [1,2,3,1,2], drop the next [1,2] since this would lead to 1 and 2 being in the result 3 times, and then take 3, which leads to [1,2,3,1,2,3]. [Source]

Example

Sử dụng ngôn ngữ Python để viết một hàm để giải quyết bài toán trên.

print(delete_nth([1,1,1,1],2)) # return [1,1] print(delete_nth([20,37,20,21],1)) # return [20,37,21]
print(delete_nth([1,1,1,1],2)) # return [1,1] print(delete_nth([20,37,20,21],1)) # return [20,37,21]

Dưới đây là một số một số giải pháp.

My solution

def delete_nth(order,max_e): for item in order: if order.count(item)<=max_e: continue else: order.remove(item) return order print(delete_nth([1,1,1,1],2)) # return [1,1] print(delete_nth([20,37,20,21],1)) # return [20,37,21] print(delete_nth([1,2,3,1,2,1,2,3],2)) # return [3, 1, 2, 1, 2, 3]
def delete_nth(order,max_e): for item in order: if order.count(item)<=max_e: continue else: order.remove(item) return order print(delete_nth([1,1,1,1],2)) # return [1,1] print(delete_nth([20,37,20,21],1)) # return [20,37,21] print(delete_nth([1,2,3,1,2,1,2,3],2)) # return [3, 1, 2, 1, 2, 3]

Remarkable ideas

  • Trước hết, đây là giải pháp đầu tiên:

    def delete_nth(order,max_e): ans = [] for o in order: if ans.count(o) < max_e: ans.append(o) return ans print(delete_nth([1,1,1,1],2)) # return [1,1] print(delete_nth([20,37,20,21],1)) # return [20, 37, 21] print(delete_nth([1,2,3,1,2,1,2,3],2)) # return [1, 2, 3, 1, 2, 3]
    def delete_nth(order,max_e): ans = [] for o in order: if ans.count(o) < max_e: ans.append(o) return ans print(delete_nth([1,1,1,1],2)) # return [1,1] print(delete_nth([20,37,20,21],1)) # return [20, 37, 21] print(delete_nth([1,2,3,1,2,1,2,3],2)) # return [1, 2, 3, 1, 2, 3]

Đầu tiên ta khởi tạo một List rỗng với tên ans = [] sau đó kiểm tra và lưu các phần tử thỏa mãn điều kiện vào ans = []

  • Đây là giải pháp thứ hai

    def delete_nth(order,max_e): return [o for i,o in enumerate(order) if order[:i].count(o)<max_e ]
    def delete_nth(order,max_e): return [o for i,o in enumerate(order) if order[:i].count(o)<max_e ]
  • Và giải pháp cuối cùng

    def delete_nth(order,max_e): return [val for idx, val in enumerate(order) if order[:idx].count(val)<max_e]
    def delete_nth(order,max_e): return [val for idx, val in enumerate(order) if order[:idx].count(val)<max_e]

Source

Bài tập này được lấy tại đây

Series
codewars.com