如何为列表中出现的次数制作字典

时间:2019-02-01 03:58:08

标签: python dictionary

我正在尝试制作一个字典,该字典将列表中出现的字符串的长度作为键,然后将出现的次数作为值。

例如,如果我有此列表:

x = ['ABC','GOOGLE','BCD','GOOGLY', 'A','A']

字典结果看起来像这样:

d = {3:2, 6:2, 1:2}

键3表示在列表中,索引的长度为3,出现了2次(“ ABC”和“ BCD”)。

这是我能想到的最好的尝试:

d = {len(x.count()):len(x.count())  for (key, value) in x} #wrong

我该怎么做?

感谢您的帮助!

7 个答案:

答案 0 :(得分:2)

x中创建一个字符串长度的Counter对象

from collections import Counter

x = ['ABC','GOOGLE','BCD','GOOGLY', 'A','A']

length_counts = Counter(len(word) for word in x)

print(length_counts)
# Counter({3: 2, 6: 2, 1: 2})

如果需要,可以将其转换为字典。

print(dict(length_counts))
# {3: 2, 6: 2, 1: 2}

答案 1 :(得分:1)

您可以分2个步骤进行操作,首先创建单个项目的长度列表,然后从计数列表中创建字典。

c = [len(item) for item in x]
d = {item:c.count(item) for item in c}

答案 2 :(得分:1)

似乎很多人都在回答这个问题,但我想也要投入2美分。

x = ['ABC','GOOGLE','BCD','GOOGLY', 'A','A']
def make_object(arr):
  lengths = (len(item) for item in arr);
  obj = {}
  for item in lengths:
    obj[item] = obj[item] + 1 if item in obj else 1
  return obj

make_object(x)

答案 3 :(得分:0)

这应该有效

from collections import Counter
x = ['ABC','GOOGLE','BCD','GOOGLY', 'A','A']
dic =Counter(list(map(len,x)))
print(dic)

答案 4 :(得分:0)

Counter绝对是Python中的最佳答案。更具功能性语言风格的答案应如下所示(Python 3.5或更高版本):

from functools import reduce

x = ['ABC','GOOGLE','BCD','GOOGLY', 'A','A']
length_counts = reduce(lambda accum, s: {**accum, len(s): accum.get(len(s), 0) + 1}, x, {})

from functools import reduce

x = ['ABC','GOOGLE','BCD','GOOGLY', 'A','A']
length_counts = reduce(lambda accum, i: {**accum, i: accum.get(i, 0) + 1}, map(len, x), {})

这种通用方法在不同语言之间具有更高的可移植性(但是在这个特定问题中,Counter绝对是正确的答案)。

答案 5 :(得分:0)

如何?

from itertools import groupby

d = dict()

for k, v in groupby(sorted(map(len, x))):
    d[k] = len(list(v))

{1: 2, 3: 2, 6: 2}

答案 6 :(得分:0)

一种简单的方法:

from collections import defaultdict

x = ['ABC','GOOGLE','BCD','GOOGLY', 'A','A']

print x

d = defaultdict(int)
for a in x:
   d[len(a)] += 1

print d

输出:

['ABC', 'GOOGLE', 'BCD', 'GOOGLY', 'A', 'A']
defaultdict(<type 'int'>, {1: 2, 3: 2, 6: 2})