列表推导,将2个值传递给字典列表中的函数

时间:2015-07-14 08:47:38

标签: python list iteration list-comprehension

我有一个数据结构:

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'

因此,行主迭代行传递一个列表而不是它看起来的每个元素。

3 个答案:

答案 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']}]