Python TypeError:第一个参数必须是可调用的

Python TypeError:第一个参数必须是可调用的,python,defaultdict,Python,Defaultdict,执行此代码时,将生成错误d=defaultdict(unidata) TypeError:第一个参数必须可调用..我想在字典中存储重复的键默认dict的第一个参数必须可调用。您传递了一个不可调用的list实例。您想改为传递“列表”类型 典型的用法如下: fs = codecs.open('grammar_new.txt', encoding='utf-8') unidata=[] d={} fr=codecs.open('rule.txt', 'w') for line in fs: l

执行此代码时,将生成错误d=defaultdict(unidata)
TypeError:第一个参数必须可调用..我想在字典中存储重复的键默认dict的第一个参数必须可调用。您传递了一个不可调用的
list
实例。您想改为传递“列表”类型

典型的用法如下:

fs = codecs.open('grammar_new.txt', encoding='utf-8')
unidata=[]
d={}
fr=codecs.open('rule.txt', 'w')
for line in fs:
    line_data=line.split()
    for i in range(0,len(line_data)):
       unidata.append(line_data[i])


d = defaultdict(unidata)
根据您在评论中提供的
unidata
,我认为您需要:

d = defaultdict(list)
for k, v in something:
    d[k].append(v)
>>从集合导入defaultdict
>>>unidata=[[u'NP-->',u'N'u NNP'],[u'NP-->',u'N'u NN'u NU'],[u'NP-->',u'N'u NNP'],[u'NP-->',u'N'N'NNP'],[u'VGF-->',u'V'VM VF'],[u'NP-->',u'N'N'NN']
>>>d=默认DICT(列表)
>>>对于unidata中的k,v:
...     d[k]。追加(v)
... 
>>>d
defaultdict(,{u'VGF-->':[u'V_VM_VF'],u'NP-->':[u'N_NNP',u'N_NN_NU',u'N_NNP',u'N_NNP',u'N_NN'])
我想在字典里存储重复的键

这根本不可能。字典中的键是唯一的。我想你想要的是:

>>> from collections import defaultdict
>>> unidata = [[u'NP--->', u'N_NNP'], [u'NP--->', u'N_NN_S_NU'], [u'NP--->', u'N_NNP'], [u'NP--->', u'N_NNP'], [u'VGF--->', u'V_VM_VF'], [u'NP--->', u'N_NN']]
>>> d = defaultdict(list)
>>> for k, v in unidata:
...     d[k].append(v)
... 
>>> d
defaultdict(<type 'list'>, {u'VGF--->': [u'V_VM_VF'], u'NP--->': [u'N_NNP', u'N_NN_S_NU', u'N_NNP', u'N_NNP', u'N_NN']})

现在
d
将为每个键包含一个包含相应值的列表。每个键必须是唯一的,但它可以有任意数量的值,这些值可以是重复的。

好吧,这不是
defaultdict
的工作方式。但是,您想要什么作为您的键(或者,值)?你只需要一个字符串的列表……你能提供一点关于行数据的详细信息吗?实际上,unidata是一个包含[[u'NP-->',u'N'u NNP'],[u'NP-->',u'N'N'u NU'],[u'NP-->',u'N'N'u NU'],[u'NP-->',u'N'N'NNP'],[u'NP-->',u'N'N'N'NNP'],[u'VGF'>',u'V'VM u'],[u'N']我得把这些存进字典里。对不起,我不知道你的意思
d = defaultdict(list)
with codecs.open('grammar_new.txt', encoding='utf-8') as f:
   for line in f:
      if len(line.rstrip()):
          key,value = line.rstrip().split()
          d[key].append(value)

print(d)