0

我被告知

通过使用字典(或您对第 4 部分的解决方案),编写一个方法 at_least(a, n),它接受一个列表 a 和一个整数 n 作为参数,并返回一个仅包含 a 中出现在至少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

我对此的看法,仅使用 adict而不是collections等...

对于 中的每个元素mylist,创建一个 value->list 查找,所以我们知道它value是唯一的,那len(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
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 回答
0

使用默认字典:

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]

将多次出现的项目作为字典获取:

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

试试下面的代码: -

>>> 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 回答