我被告知
通过使用字典(或第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]
修改:
我不明白字典是如何使用的,但输出不是字典形式的?我的理解是字典具有每个对象的值。我不确定我是否使用了合适的条款。
答案 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]