有了这样的列表,我可以通过以下方式获得相同值的组:
N = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]
C = Counter(N)
print([[k, ] * v for k, v in C.items()])
获得以下结果。
[[1],[2,2],[3,3,3],[4,4,4,4],[5,5,5,5,5]]
但是,如果我有以下列表
N = [{'doc':'A','value':300,'W':1},{'doc':'B','value':301,'W':0.5},{'doc':'C','value':301,'W':0.45},{'doc':'D','value':301,'W':0.3},{'doc':'E','value':300,'W':1},]
我希望以前一个方式进行分组,使用键值'将它们分组,即:
[[{'doc':A,'value':300,'W':1}, {'doc':'E','value':300,'W':1}],[{'doc':'B','value':301,'W':0.5},{'doc':'C','value':301,'W':0.45},{'doc':'D','value':301,'W':0.3}]]
有人可以帮忙吗?
答案 0 :(得分:2)
您可以使用collections.defaultdict
解决此问题。
collections.Counter
仅对递增整数计数器有用,即使是only with hashable objects也是如此。这不是你想要做的事情。
from collections import defaultdict
N = [{'doc':'A','value':300,'W':1}, {'doc':'B','value':301,'W':0.5},
{'doc':'C','value':301,'W':0.45}, {'doc':'D','value':301,'W':0.3},
{'doc':'E','value':300,'W':1},]
d = defaultdict(list)
for i in N:
d[i['value']].append(i)
res = list(d.values())
# [[{'W': 1, 'doc': 'A', 'value': 300}, {'W': 1, 'doc': 'E', 'value': 300}],
# [{'W': 0.5, 'doc': 'B', 'value': 301},
# {'W': 0.45, 'doc': 'C', 'value': 301},
# {'W': 0.3, 'doc': 'D', 'value': 301}]]
顺便说一句,这也为您的第一个问题提供了更直接的解决方案:
N = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]
d = defaultdict(list)
for i in N:
d[i].append(i)
res = list(d.values())
# [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]
答案 1 :(得分:1)
由于多种原因,无法使用计数器:
Counter
仅适用于可散列值。Counter
使用了dicts,它也只能保留每组1个字典并丢弃其余部分。此处的解决方案是使用defaultdict
代替Counter
:
from collections import defaultdict
N = [{'doc':'A','value':300,'W':1},{'doc':'B','value':301,'W':0.5},
{'doc':'C','value':301,'W':0.45},{'doc':'D','value':301,'W':0.3},
{'doc':'E','value':300,'W':1}]
groups = defaultdict(list)
for dic in N:
groups[dic['value']].append(dic)
result = list(groups.values())
# [[{'W': 1, 'doc': 'A', 'value': 300}, {'W': 1, 'doc': 'E', 'value': 300}],
# [{'W': 0.5, 'doc': 'B', 'value': 301},
# {'W': 0.45, 'doc': 'C', 'value': 301},
# {'W': 0.3, 'doc': 'D', 'value': 301}]]
答案 2 :(得分:0)
没有任何导入的简单手动方法怎么样:
N = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]
d={}
for i,j in enumerate(N):
if j not in d:
d[j]=[j]
else:
d[j].append(j)
print(d)
输出:
{1: [1], 2: [2, 2], 3: [3, 3, 3], 4: [4, 4, 4, 4], 5: [5, 5, 5, 5, 5]}
或:
print(d.values())
输出:
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]