【问题标题】:How to Extract Values from Dictionaries and Create Lists From Them如何从字典中提取值并从中创建列表
【发布时间】:2018-01-30 05:15:12
【问题描述】:

我有一个字典列表:

dictionaries = [
    {'id': 1, 'name': 'test1', 'description': 'foo'}, 
    {'id': 2, 'name': 'test2', 'description': 'bar'}
]

我想将每个字典中的值与键分开,制作如下列表:

[(1 ,'test1', 'foo'), (2, 'test2', 'bar')]

我有以下代码来执行此操作...

values_list = []

for dict in dictionaries:
    values_list.append(list(dict.values()))

当我在我的应用程序中运行此代码时,我得到:

TypeError: list() 接受 0 个位置参数,但给出了 1 个

进行这种类型的列表理解的正确方法是什么?

【问题讨论】:

  • [tuple(d.values()) for d in dictionaries]
  • 您的(发布的)代码也没有错误。您是否从其他地方复制了跟踪?
  • 可能在完整代码的某个地方,您将 python 内置的 list() 函数替换为您自己定义的不带参数的 list() 函数。这解释了为什么你会得到异常
  • @caramel1995 感谢您的提示。我要仔细检查整个应用程序...

标签: python python-3.x list dictionary list-comprehension


【解决方案1】:

这可以通过几个comprehensions 来完成,例如:

代码:

def get_values_as_tuple(dict_list, keys):
    return [tuple(d[k] for k in keys) for d in dict_list]

如何?

这是如何工作的?这是一个嵌套的comprehension。让我们从内到外,开始:

tuple(d[k] for k in keys)

这会创建一个由d 中的所有元素组成的元组,这些元素是通过kkeys 中指定的。所以,这很好,但到底是什么dkkeys

  • keys 被传递给函数,是我们将在字典中查找的键。

  • k 是来自k in keyskeys 中的各个值。

  • d 是来自d in dict_listdict_list 中的单个字典。

外部理解构建了上面讨论的元组列表:

[tuple(d[k] for k in keys) for d in dict_list]

测试代码:

dictionaries = [{'id': 1, 'name': 'test1', 'description': 'foo'},
                {'id': 2, 'name': 'test2', 'description': 'bar'}]


def get_values_as_tuple(dict_list, keys):
    return [tuple(d[k] for k in keys) for d in dict_list]

print(get_values_as_tuple(dictionaries, ('id', 'name', 'description')))

结果:

[(1, 'test1', 'foo'), (2, 'test2', 'bar')]

【讨论】:

  • 感谢您的提示,我试过了,效果很好。不过,我不确定具体如何。如果我理解正确,您定义的函数是说“从第一个参数中提供的字典列表中查找每个字典。拉出第二个参数中指示的所有键并从剩下的内容中创建一个元组。” “[k]”代码是什么意思?这是“从 d 中删除 k”的简写吗?
【解决方案2】:

您好,如果您想转换元组列表,那么使用列表理解技术非常容易,或者您正在使用它的代码用于列表列表,但您期望的解决方案看起来像元组列表

dictionaries = [{'id': 1, 'name': 'test1', 'description': 'foo'}, 
{'id': 2, 'name': 'test2', 'description': 'bar'}]
values_list = []

for dict in dictionaries:
    values_list.append(tuple(dict.values()))

data = [tuple(dict.values()) for dict in dictionaries]   

print(values_list)
print(data)

这可能会对你有帮助,它会给你这样的输出

[(1, 'test1', 'foo'), (2, 'test2', 'bar')]
[(1, 'test1', 'foo'), (2, 'test2', 'bar')]

【讨论】:

  • 很抱歉,我将其用作原始问题的变量
【解决方案3】:
In [14]: dictionaries = [{'id': 1, 'name': 'test1', 'description': 
'foo'}, 
   ....: {'id': 2, 'name': 'test2', 'description': 'bar'}]

In [15]: [tuple(d.values()) for d in dictionaries]
Out[15]: [('foo', 1, 'test1'), ('bar', 2, 'test2')]

你好,Trey,Dict在python中是无序的,所以tuple中的值也可能是无序的。如果你想要一个有序的结果,你可以试试python中的OrderedDict

【讨论】:

    【解决方案4】:

    在 Python 2.x 中:

    from collections import namedtuple
    dictionaries = [
        {'id': 1, 'name': 'test1', 'description': 'foo'}, 
        {'id': 2, 'name': 'test2', 'description': 'bar'}
    ]
    main_list = []
    keys = namedtuple("keys",['id','name','description'])
    for val in dictionaries:
        data = keys(**val)
        main_list.append((data.id,data.name,data.description))
    print(main_list)
    >>>[(1, 'test1', 'foo'), (2, 'test2', 'bar')]
    

    Python 3.x:

    dictionaries = [
        {'id': 1, 'name': 'test1', 'description': 'foo'}, 
        {'id': 2, 'name': 'test2', 'description': 'bar'}
    ]
    data = [tuple(val.values()) for val in dictionaries]
    print(data)
    >>>[(1, 'test1', 'foo'), (2, 'test2', 'bar')]
    

    【讨论】:

      【解决方案5】:

      代码:

      dicts = [
              {'id': 1, 'name': 'test1', 'description': 'foo'}, 
              {'id': 2, 'name': 'test2', 'description': 'bar'}
              ]
      
      v_list = []
      
      for d in dicts:
          v_list.append( tuple( d.values() ) )
      
      print( v_list )
      

      结果:

      [(1, 'test1', 'foo'), (2, 'test2', 'bar')]
      

      【讨论】:

      • 感谢您的快速响应!
      猜你喜欢
      • 2021-03-23
      • 2018-10-04
      • 2022-11-30
      • 2020-11-10
      • 2016-09-24
      • 2021-09-01
      • 1970-01-01
      • 2021-04-06
      • 2022-01-16
      相关资源
      最近更新 更多