1

私はこのリストを持っています:

mylist = [20, 30, 25, 20, 30]

を使用して重複値のインデックスを取得した後

[i for i, x in enumerate(mylist) if mylist.count(x) > 1]

結果は次のとおりです。

`[0, 1, 3, 4]` 

2 組の重複値を持つ。知りたいのですが、より高い重複値のみを取得するにはどうすればよいですか? このリストでは、重複値のリスト全体ではなく、それまたはその30インデックスのいずれか、または です。14

よろしく...

4

6 に答える 6

6

これはO(n)です

>>> from collections import Counter
>>> mylist = [20, 30, 25, 20, 30]
>>> max(k for k,v in Counter(mylist).items() if v>1)
30
于 2012-06-29T02:45:34.263 に答える
5

最大重複値の取得:

max(x for x in mylist if mylist.count(x) > 1)

残念ながら、 count() 呼び出しが繰り返されるため、これは O(n**2) パフォーマンスを持っています。リストが長い場合に重要な O(n) パフォーマンスを持つ同じことを行うためのより言葉の多い方法を次に示します。

seen = set()
dups = set()
for x in mylist:
    if x in seen:
        dups.add(x)
    seen.add(x)
max_dups = max(dups)
于 2012-06-29T01:37:52.580 に答える
1

考慮すべきいくつかの相対的なタイミング:

from collections import Counter
from collections import defaultdict

mylist = [20, 30, 25, 20, 30]

def f1():
    seen = set()
    dups = set()
    for x in mylist:
        if x in seen:
            dups.add(x)
        seen.add(x)
    max_dups = max(dups)

def f2():
    max(x for x in mylist if mylist.count(x) > 1)

def f3():
    max(k for k,v in Counter(mylist).items() if v>1)

def f4():
    dd = defaultdict(int)
    for i in mylist:
        dd[i] += 1

    max(i for i in dd if dd[i] > 1)

def f5():
    d = dict.fromkeys(mylist, 0)            
    for i in mylist:
       d[i] += 1

    max(i for i in d if d[i] > 1)

cmpthese([f1,f2,f3,f4,f5])    

プリント:

   rate/sec     f3     f4     f5     f2     f1
f3   93,653     -- -63.3% -73.0% -79.2% -83.6%
f4  255,137 172.4%     -- -26.3% -43.3% -55.3%
f5  346,238 269.7%  35.7%     -- -23.1% -39.3%
f2  450,356 380.9%  76.5%  30.1%     -- -21.0%
f1  570,419 509.1% 123.6%  64.7%  26.7%     --

だから賢く選ぶ

于 2012-06-29T05:18:00.243 に答える
1

それを行う別の O(n) 方法、理由は...

>>> from collections import defaultdict
>>> 
>>> mylist = [20,30,25,20,30]
>>> dd = defaultdict(int)
>>> for i in mylist:
...    dd[i] += 1
...
>>> max(i for i in dd if dd[i] > 1)
30

通常の古い辞書を使用して行うこともできます。

>>> d = dict.fromkeys(mylist, 0)
>>> for i in mylist:
...   d[i] += 1
... 
>>> max(i for i in d if d[i] > 1)
30
于 2012-06-29T02:11:40.870 に答える
0
$ cat /tmp/1.py
from itertools import groupby

def find_max_repeated(a):
    a = sorted(a, reverse = True)
    for k,g in groupby(a):
        gl = list(g)
        if len(gl) > 1:
            return gl[0]

a = [1,1,2,3,3,4,5,4,6]
print find_max_repeated(a)

$ python /tmp/1.py
4
于 2012-06-29T01:44:03.363 に答える