在python中使用defaultdict

时间:2015-12-22 16:48:19

标签: python

我正在将txt文件中的项目读入list,然后将其转换为字典,如下所示 -

def getfeatures_into_list(inputfilename):
    fid=open(inputfilename,"r")
    dict_Lab_Features=defaultdict(int)
    list1=[]
    for line in fid:
        list1.append(line.rstrip().lower())
    list1=list(set(list1))  #Removing duplicates
    c=0
    for items in sorted(list1):
        dict_Lab_Features[items]=c
        c+=1

    dict_Lab_Features=sorted(dict_Lab_Features.items(), key=operator.itemgetter(1))
    print(dict_Lab_Features['Hello'])

我在print语句中遇到错误

list indices must be integer,not str

编辑我想按升序对值进行排序。

3 个答案:

答案 0 :(得分:2)

你无法对dict进行排序。 Dicts是元素的无序映射。

让我们分析以下几行:

dict_Lab_Features=sorted(dict_Lab_Features.items(), key=operator.itemgetter(1))

来自sorted的文档:

  

从iterable中的项目返回一个新的排序列表。

之后,dict_Lab_Features是键值元组的排序列表。之后,您尝试使用'Hello'

对其进行索引
print(dict_Lab_Features['Hello'])

在这里,您尝试使用'Hello'为该列表编制索引,这就是您收到错误list indices must be integer,not str

的原因

答案 1 :(得分:2)

在这一行:

dict_Lab_Features=sorted(dict_Lab_Features.items(), key=operator.itemgetter(1))

您已重新分配dict_Lab_Features以便它是一个列表。这是因为sorted()的输出始终是一个列表。当然,列表不能将字符串作为索引。

你应该学会将词典视为本身未排序。当您确实需要跟踪广告订单时,会出现OrderedDict这样的事情,但对于大多数情况,常规dict很好。您只需养成以所需顺序遍历字典的习惯,而不必担心字典是否以任何顺序存储

以排序顺序遍历字典的常用方法是循环遍历排序的键,例如:

for key in sorted(dict_Lab_Features):
    print dict_Lab_Features[key]

for key, value in sorted(dict_Lab_Features.items()):
    print value

或者,如果您想循环排序的值,

for value in sorted(dict_Lab_Features.values()):
    print value

答案 2 :(得分:1)

致电dict_Lab_Features时,

dict不再是dict.items()。无法使用字符串键来处理dict.items()对象(它实际上只是元组列表[(key, value), ... ])。

此外,“排序”您打算按名称使用的字典也没有多大意义。看起来您需要collections.OrderedDict或者您应该完全跳过订购