2017-01-13 3 views
0

これで、リストから複製を削除し、同時に注文を維持する必要があります。しかし、私はsetやforループを使用することが許されないなどの特定の条件があります。また、関数が新しいリストを返さず、元のリストを更新しなければならない場合私は次のコードを持っていますが、それは部分的にしか機能しません。私は一度だけチェックしていることを知っていますが、さらに進める方法がわかりません。セットなしでループを削除して複製を削除し、順序を維持して元のリストを更新します

def clean_list(values): 
    i = len(values)-1 
    while i > 0: 
     if values[i] == values[i-1]: 
      values.pop(i) 
     i -= 1 
    return values 

values = [1, 2, 0, 1, 4, 1, 1, 2, 2, 5, 4, 3, 1, 3, 3, 4, 2, 4, 3, 1, 3, 0, 3, 0, 0] 
new_values = clean_list(values) 
print(new_values) 

は私に結果を与える:

[1, 2, 0, 1, 4, 1, 2, 5, 4, 3, 1, 3, 4, 2, 4, 3, 1, 3, 0, 3, 0] 

おかげ

答えて

0

は、以下のことを試してみてください。

2つのwhileループを使用すると、最初のアイテムは固有のアイテムを取得し、残りのリストは他の一致するアイテムを検索して削除し、順序を維持します。

def clean_list(lst): 
    i = 0 
    while i < len(lst): 
     item = lst[i] # item to check 
     j = i + 1 # start next item along 
     while j < len(lst): 
      if item == lst[j]: 
       lst.pop(j) 
      else: 
       j += 1 
     i += 1 

values = [1, 2, 0, 1, 4, 1, 1, 2, 2, 5, 4, 3, 1, 3, 3, 4, 2, 4, 3, 1, 3, 0, 3, 0, 0] 
clean_list(values) 
print(values) 

# Output 
[1, 2, 0, 4, 5, 3] 

更新:改善機能は速く、最悪の場合のように最初のものであったO(N2)

def clean_list(lst): 
    seen = set() 
    i = 0 
    while i < len(lst): 
     item = lst[i] 
     if item in seen: 
      lst.pop(i) 
     else: 
      seen.add(item) 
      i += 1 

values = [1, 2, 0, 1, 4, 1, 1, 2, 2, 5, 4, 3, 1, 3, 3, 4, 2, 4, 3, 1, 3, 0, 3, 0, 0] 
clean_list(values) 
print(values) 

# Output 
[1, 2, 0, 4, 5, 3] 
関連する問題