显示值以及使用词典发生的次数

时间:2012-10-15 07:20:30

标签: python

我被告知

  

通过使用字典(或第4部分的解决方案),编写一个方法   at_least(a,n)将list,a和一个整数n作为参数   并返回一个列表,其中只包含出现在的元素   至少n次。对于完整标记,列表应包含   元素按照它们第一次出现的顺序排列。

我能够在不使用字典的情况下解决这个问题,

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]

修改

我不明白字典是如何使用的,但输出不是字典形式的?我的理解是字典具有每个对象的值。我不确定我是否使用了合适的条款。

5 个答案:

答案 0 :(得分: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}

答案 1 :(得分: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}

或使用count:

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}

答案 2 :(得分: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}

答案 3 :(得分: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 

答案 4 :(得分:0)

我对此的看法是,仅使用dict而非collections等...

对于mylist中的每个元素,创建一个值 - &gt;列表查找,因此我们知道value是唯一的,而len(value)是出现的次数,{{1} 1}}是第一次出现的索引。

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)

  

{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]}

我们可以获得多次出现的元素(使用列表推导):

mydict

但是,为了获得额外的功劳,我们可以通过使用以下方式对其进行排序以返回原始订单:

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