0

と言われたことがあります

辞書 (またはパート 4 の解決策) を使用して、リスト a と整数 n を引数として取り、a の要素のみを含むリストを返すメソッド at_least(a, n) を作成します。少なくとも n 回。完全なマークの場合、リストには要素が a で最初に出現する順序で含まれている必要があります。

辞書を使わずにこれを理解することができました。

def at_least2(a, n):
    return [x for x in a if a.count(x) is n]

辞書を使ってこれを書くにはどうすればいいのだろうと思っていましたか?

入力は次のとおりです。

a = [-6, 8, 7, 3, 2, -9, 1, -3, 2, -4, 4, -8, 7, 8, 2, -2, -7, 0, 1, 
     -9, -3, -7, -3, -5, 6, -3, 6, -3, -10, -8]

def at_least(a, 2):

そして出力:

[8, 7, 2, -9, 1, -3, 2, -8, 7, 8, 2, -7, 1, -9, -3, -7, -3, 6, -3, 6, -3, -8]

編集

辞書がどのように使用されているかわかりませんが、出力は辞書形式ではありませんか? 私の理解では、辞書には各オブジェクトの値があります。正しい用語を使用しているかどうかわかりません。

4

5 に答える 5

1

ここでの最良のオプションは collections.Counter()

from collections import Counter
def atleast(a,n):
    c=Counter(a)
    return [x for x in c if c[x]>=2]

a = [-6, 8, 7, 3, 2, -9, 1, -3, 2, -4, 4, -8, 7, 8, 2, -2, -7, 0, 1, -9, -3, -7, -3, -5, 6, -3, 6, -3, -10, -8]
print atleast(a,2)

出力:

[1, 2, 6, 7, 8, -9, -8, -7, -3]

または、次を使用することもできますsetdefault()

>>> a = [-6, 8, 7, 3, 2, -9, 1, -3, 2, -4, 4, -8, 7, 8, 2, -2, -7, 0, 1, -9, -3, -7, -3, -5, 6, -3, 6, -3, -10, -8]
>>> dic={}
>>> for x in a:
...   dic[x]=dic.setdefault(x,0)+1
... 
>>> dic
{0: 1, 1: 2, 2: 3, 3: 1, 4: 1, 6: 2, 7: 2, 8: 2, -10: 1, -9: 2, -8: 2, -7: 2, -6: 1, -5: 1, -4: 1, -3: 5, -2: 1}
于 2012-10-15T07:44:56.977 に答える
0

これについての私の見解は、aのみを使用し、などは使用しdictていませんcollections...

の要素ごとに、value-> listルックアップを作成します。これにより、一意であり、出現回数であり、最初の出現のインデックスであるmylistことがわかります。valuelen(value)value[0]

mylist = [-6, 8, 7, 3, 2, -9, 1, -3, 2, -4, 4, -8, 7, 8, 2, -2, -7, 0, 1, -9, -3, -7, -3, -5, 6, -3, 6, -3, -10, -8]
mydict = {}
for idx, val in enumerate(mylist):
    mydict.setdefault(val, []).append(idx)

これはmydict

{0:[17]、1:[6、18]、2:[4、8、14]、3:[3]、4:[10]、6:[24、26]、7:[2、 12]、8:[1、13]、-10:[28]、-9:[5、19]、-8:[11、29]、-7:[16、21]、-6:[0 ]、-5:[23]、-4:[9]、-3:[7、20、22、25、27]、-2:[15]}

複数回出現する要素を取得できます(これはリスト内包表記を使用します)。

something = [k for k, v in mydict.iteritems() if len(v) > 1]
print something
# [1, 2, 6, 7, 8, -9, -8, -7, -3]

ただし、その追加のクレジットを取得するには、次のコマンドを使用して、元の注文を返すように並べ替えることができます。

something.sort(key=mydict.get)
print something
# [8, 7, 2, -9, 1, -3, -8, -7, 6]
于 2012-10-15T08:33:08.860 に答える
0

以下のコードを試してください:-

>>> l=[1,2,34,436,1,2,3,4,12,3,2,1]
>>> dic = {}

>>> for x in l:
        if x in dic:
            dic[x] += 1
        else:
            dic[x] = 1


>>> dic
{1: 3, 2: 3, 3: 2, 4: 1, 12: 1, 34: 1, 436: 1}

# Get list of (key, value) tuple, for key occuring more than once.
>>> list_new = [(key, value) for key, value in dic.iteritems() if dic[key] > 1] 
>>> list_new
[(1, 3), (2, 3), (3, 2)]

# Create dictionary out of list
>>> dic2 = dict(list_new)
>>> dic2
{1: 3, 2: 3, 3: 2}
于 2012-10-15T07:31:16.723 に答える
0

defaultdict を使用します。

In [7]: l=[1,2,34,436,1,2,3,4,12,3,2,1]

In [8]: import collections
   ...: d = collections.defaultdict(int)
   ...: for x in l: d[x] += 1
   ...: 

In [9]: d
Out[9]: defaultdict(<type 'int'>, {1: 3, 2: 3, 3: 2, 4: 1, 12: 1, 34: 1, 436: 1})

ただの口述:

d = {}
[d.__setitem__(item,1+d.get(item,0)) for item in l]
print d

{1: 3, 2: 3, 3: 2, 4: 1, 12: 1, 34: 1, 436: 1}

またはカウントを使用:

d=dict( [ (i, l.count(i)) for i in set(l) ] )

リストとして複数回出現するアイテムを取得します。

In [17]: [x for x in set(l) if d[x] > 1]
Out[17]: [1, 2, 3]

dict として複数回出現する項目を取得します。

In [21]: dict( [ (i, l.count(i)) for i in set(l) if l.count(i) > 1 ] )
Out[21]: {1: 3, 2: 3, 3: 2}
于 2012-10-15T07:23:02.750 に答える
0
def atLeast(a,n):
    A = {}
    for i in a:
        if i not in A:
            A[i] = 0
        A[i] += 1 

    new_a = []
    for i in a: 
        if A[i] >= n:
            new_a.append(i)
    return new_a 

完全なマークの場合:

def atLeast(a,n):
    A = {}
    for i in a:
        if i not in A:
            A[i] = 0
        A[i] += 1 

    new_a = []
    Appended = {} 
    for i in a: 
        if i in Appended:
            continue 
        Appended[i] = 0 
        if A[i] >= n:
            new_a.append(i)
    return new_a 
于 2012-10-15T08:12:03.780 に答える