Python - 将嵌套列表转换为字典?

时间:2017-10-14 00:13:21

标签: python dictionary

我使用的嵌套列表包含各种类型的犯罪。为了澄清,crimeDescription的格式如下: [['Murder'], ['Assault'], ... , ['Stalking'], ['Rape']]。我希望创建一个字典,它将保存此列表中的每个值/犯罪并记录其频率,或者它在数据集中出现的频率。由于字典中的键不能是列表,我试图通过在for循环中调用其索引i [0]来访问每个嵌套列表中的字符串。当我运行以下程序时:

#TypesOfCrime --> a List containing all different types of crime that's happened in LA

TypesOfCrime = []
CrimeFreq = {}
for i in crimeDescription: 
    if i not in TypesOfCrime:
        i = i[0]
        CrimeFreq[i] = 1
    elif i in TypesOfCrime:
        i = i[0]
        CrimeFreq[i] += 1

我收到以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-75-a8698e79e96a> in <module>()
      5     if i not in TypesOfCrime:
      6         TypesOfCrime.append(i)
----> 7         CrimeFreq[i[0]] = 1
      8     elif i in TypesOfCrime:
      9         CrimeFreq[i[0]] += 1

TypeError: 'float' object is not subscriptable

我做错了什么?如何创建包含嵌套列表中每个不同值的字典?任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:0)

要使用dict计算某些内容,请检查该键是否已存在,然后递增该值,否则添加值为1的键:

crime_freq = {}

for current_crime in crimeDescription:
    crime = current_crime[0]
    if crime in crime_freq:
        crime_freq[crime] += 1
    else:
        crime_freq[crime] = 1

解决问题的现代方法是使用collections.Counter和生成器表达式:

crime_freq = collections.Counter(crime[0] for crime in crimeDescription)

答案 1 :(得分:0)

你想要钥匙不存在,创造价值或钥匙存在,增值。

我推荐使用setdefault()方法。

crime_freq = {}

for current_crime in crimeDescription:
    crime = current_crime[0]
    crime_freq.setdefault(crime, 0)
    crime_freq[crime] += 1

如果使用setdefault()方法,代码很简单。

我经常经常使用setdefault()方法。