我有一个数据结构:
my_list = [0] {key1: [1, 2, 3]
key2: [4, 5, 6]
key3: .....
key4: .....}
[1] {key1: [.......]
key2: [... etc.
即,4个字典的列表,每个字典具有4个键,每个键具有3个值的列表。很好,也很一致。
我想遍历每个列表中的每个值,并使用外部函数进行更新。这个外部函数有2个参数(我正在更新的值和其各自键中包含的浮点值)。这是数学的基本部分,但问题在于迭代文件,因为它变得越来越复杂,我迷路了。
到目前为止我做了什么:
def Efunction_conversion(my_list):
converted_dict_list = []
for i in range(0,4):
new_dict = {key:[external_function(float(key), value) for key, value in my_list[i].iteritems()]} ##problems occur here
converted_dict_list.append(new_dict)
return converted_dict_list
代码无效,其他人可能会明白为什么。
外部功能:
def external~_function(key, value):
E = ((value - key)/key)**2
return E
错误TypeError: unsupported operand type(s) for -: 'list' and 'float'
因此,行主迭代行传递一个列表而不是它看起来的每个元素。
答案 0 :(得分:2)
在你的for循环中,你只用一个键来创建dict,并且键的循环只发生在列表理解中 -
[external_function(float(key), value) for key, value in my_list[i].iteritems()]
这样的dict并没有发生。另外,如果我没有错,value
是一个列表,所以你将整个列表作为参数传递给外部函数,这可能不是你想要的。
这样做的一个简单方法是(对于带有字典理解的Python 2.7+) -
def Efunction_conversion(my_list):
converted_dict_list = []
for x in my_list:
converted_dict_list.append({key:[external_function(float(key),y) for y in value] for key, value in x.iteritems()}
return converted_dict_list
这样的一个班轮就是 -
def Efunction_conversion(my_list):
return [{key:[external_function(float(key),y) for y in value] for key, value in x.iteritems()} for x in my_list]
答案 1 :(得分:1)
问题在于您的外部功能,您可以将其更改为:
def external_function(key, value):
E=0.0
for v in value:
E += ((v- key)/key)**2
return E
如果你想把它作为一个清单:
def external_function(key, value):
E=[]
for v in value:
E.append( ((v- key)/key)**2 )
return E
你的external_function需要一个float / int,但它有一个列表,所以抛出了错误
答案 2 :(得分:1)
如果您在编写/理解列表/字典理解方面遇到困难,请在尝试编写单行代码之前先缩进它:
my_list = [
{'key1': [1, 2, 3],
'key2': [4, 5, 6],}
]
def external_function(key, value):
return key + str(value)
other_list = [
{
k: [external_function(k, el) for el in v]
for k, v in d.iteritems()
}
for d in my_list
]
[{'key1': ['key11', 'key12', 'key13'], 'key2': ['key24', 'key25', 'key26']}]