【问题标题】:List comprehensions, passing 2 values to a function from a list of dictionaries列表推导,将 2 个值传递给字典列表中的函数
【发布时间】:2015-10-02 19:33:34
【问题描述】:

我有一个数据结构:

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'

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

【问题讨论】:

  • k 是在哪里定义的?你有什么错误吗?
  • 您还应该详细说明它是如何不工作的,测试时哪个输入没有发生什么?
  • 当它被传递给外部函数时,我得到“TypeError: unsupported operand type(s) for -: 'list' and 'float'”。
  • @Anand S Kumar k 应该是“关键”我现在编辑了代码。
  • 能否提供外部函数示例

标签: python list iteration list-comprehension


【解决方案1】:

在你的 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]

【讨论】:

  • 这看起来不错,我会检查一下谢谢。!作为一个快速的问题,key: 语法有什么作用?我从来没有遇到过,也不知道它叫什么。
  • 那是字典理解。在这里查看 - stackoverflow.com/questions/14507591/…
【解决方案2】:

如果您在编写/理解列表/字典理解时遇到问题,请先缩进,然后再尝试编写单行:

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

【讨论】:

    【解决方案3】:

    问题在于您的外部函数,您可以将其更改为:

    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 需要一个浮点数/整数,但它有一个列表,因此引发了错误

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      相关资源
      最近更新 更多