2017-11-03 10 views
2

数字のリストでは、それぞれの数字が複数回表示されることがあります。異なる数字の頻度が同じ場合、結果はリストの最後に表示されます。一例では、[1,7,2,1,2]の最小公倍数は7です(もともとは2ではありません)。そして、リストがソートされていない滞在する必要がリスト内で共通の数字を最小限にするpython

I持って次が、それは常に大歓迎任意のヘルプは次のようになり

def least_common_in_unsorted(integers): 
    leastCommon = integers[0] 
    check = 1 
    appears = 1 
    for currentPosition in integers: 
     if currentPosition == leastCommon: 
      appears + 1 
     elif currentPosition != leastCommon: 
      if check <= appears: 
       check = 1 
       appears = 1 
       leastCommon = currentPosition 
    return leastCommon 

leastCommon

への最後のエントリを設定します

+2

の「最小公整数[1、7、2、1、2] 2であります"< - 7を意味しましたか? –

+0

少なくとも共通番号は7ですか?それは一度だけ起こったからです。あなたは少なくとも普通の数字で何を意味するのですか –

+1

typo、申し訳ありませんが、それは7であると思われます。 – moonhead

答えて

2

それは今の私の心に来る最も簡単な方法です:

a = [1, 7, 2, 1, 2] 
c, least = len(a), 0 
for x in a: 
    if a.count(x) <= c : 
     c = a.count(x) 
     least = x 
least # 7 

と2つの以上の項目にそれが最後に出現するものを返します。

a = [1, 7, 2, 1, 2, 7] # least = 7 
+0

'count'を複数回呼び出すのは効率的ではありませんが、うまくいくようです。 –

+1

ありがとう、私はこれを複数の異なるリストと試してみる必要があります。 – moonhead

-1
def least_common(lst): 
    return min(set(lst), key=lst.count) 

編集:申し訳ありませんが、これはありませんユーザーが要求するように、必ずしも出現頻度が最も低い最後のリスト項目を取るとは限りません。この例では動作しますが、すべてのインスタンスでは動作しません。

+0

私はこれをお試しいただきありがとうございますが、これは最低の共通番号の最初のインスタンスを返します、 2つの数字が同じ最低周波数 – moonhead

+0

abccdの答えを参照 – offeltoffel

2

この回答は、最後に発生するいずれかを選択しながら、出現の同じ数の複数の項目を組み込むために@offtoffelに基づいています:

def least_common(lst): 
    return min(lst, key=lambda x: (lst.count(x), lst[::-1].index(x))) 


print(least_common([1,2,1,2])) 
# 2 

print(least_common([1,2,7,1,2])) 
# 7 

編集:私は、より簡単な解決策があることに気づいていること(ほんの始まりにリストを反転し、minは最小カウントを持っている最後の値を維持します)効率的かつ効果的である:

def least_common(lst): 
    lst = lst[::-1] 
    return min(lst, key=lst.count) 


print(least_common([1,2,1,2])) 
# 2 

print(least_common([1,2,7,1,2])) 
# 7 
+1

あなたのような解決策を考え出しました。いい案! – offeltoffel

+2

これは、@ Armanの答えよりも簡潔で効率的ではないことに注意してください。あなたは同じリストを逆にし続けます。 –

3

を使用して0:

from collections import Counter 

lst = [1, 7, 2, 1, 2] 
cnt = Counter(lst) 
mincnt = min(cnt.values()) 
minval = next(n for n in reversed(lst) if cnt[n] == mincnt) 

print(minval) #7 
2

短いが非効率:collections.Counterを用い

>>> min(a[::-1], key=a.count) 
7 

効率的なバージョン:

>>> min(a[::-1], key=Counter(a).get) 
7 
関連する問題