Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-将dict的某些字段转换为列表_Python_Python 2.7 - Fatal编程技术网

Python-将dict的某些字段转换为列表

Python-将dict的某些字段转换为列表,python,python-2.7,Python,Python 2.7,我有以下Python指令: { 'parameter_010': False, 'parameter_009': False, 'parameter_008': False, 'parameter_005': 'C<sub>MAX</sub>', 'parameter_004': 'L', 'parameter_007': False, 'parameter_006': 'R', 'parameter_001': 'Foo',

我有以下Python指令:

{
  'parameter_010': False, 
  'parameter_009': False, 
  'parameter_008': False, 
  'parameter_005': 'C<sub>MAX</sub>', 
  'parameter_004': 'L', 
  'parameter_007': False, 
  'parameter_006': 'R', 
  'parameter_001': 'Foo', 
  'id': 7542, 
  'parameter_003': 'D', 
  'parameter_002': 'M'
}
哪一种是蟒蛇式的方法?我显然可以开始迭代,但不知道是否有比这更好的东西


Python 2.7

因此,假设您知道您正在使用JSON以及如何反序列化:

>>> import json
>>> s = """{
...   "parameter_010": false,
...   "parameter_009": false,
...   "parameter_008": false,
...   "parameter_005": "CMAX",
...   "parameter_004": "L",
...   "parameter_007": false,
...   "parameter_006": "R",
...   "parameter_001": "Foo",
...   "id": 7542,
...   "parameter_003": "D",
...   "parameter_002": "M"
... }"""
>>> d = json.loads(s)
如果您的
参数\u nnn
始终严格遵循此格式,则只需按照您的要求对筛选出的项目进行排序(因为您需要的是词典排序!):

如果只需要这些值,只需执行另一个过程:

>>> [v for _,v in sorted([(k,v) for k, v in d.items() if v and k.startswith('parameter')])]
['Foo', 'M', 'D', 'L', 'CMAX', 'R']
>>>
注意,您将不得不以某种方式循环

更具可读性的版本:

>>> selection = [(k,v) for k, v in d.items() if v and k.startswith('parameter')]
>>> [v for _,v in sorted(selection)]
['Foo', 'M', 'D', 'L', 'CMAX', 'R']
编辑:主要警告 注意,如果值可以是
0
或您实际需要的任何其他falsy值,则这将不起作用,例如:

>>> pprint(d)
{'id': 7542,
 'parameter_001': 'Foo',
 'parameter_002': 'M',
 'parameter_003': 'D',
 'parameter_004': 'L',
 'parameter_005': 'CMAX',
 'parameter_006': 'R',
 'parameter_007': False,
 'parameter_008': False,
 'parameter_009': False,
 'parameter_010': False,
 'parameter_011': 0}
>>> selection = [(k,v) for k, v in d.items() if v and k.startswith('parameter')]
>>> [v for _, v in sorted(selection)]
['Foo', 'M', 'D', 'L', 'CMAX', 'R']
因此,如果您想特别过滤
False
的实例(而不是
0
),那么您必须使用
is


因此,假设您知道您正在使用JSON以及如何反序列化:

>>> import json
>>> s = """{
...   "parameter_010": false,
...   "parameter_009": false,
...   "parameter_008": false,
...   "parameter_005": "CMAX",
...   "parameter_004": "L",
...   "parameter_007": false,
...   "parameter_006": "R",
...   "parameter_001": "Foo",
...   "id": 7542,
...   "parameter_003": "D",
...   "parameter_002": "M"
... }"""
>>> d = json.loads(s)
如果您的
参数\u nnn
始终严格遵循此格式,则只需按照您的要求对筛选出的项目进行排序(因为您需要的是词典排序!):

如果只需要这些值,只需执行另一个过程:

>>> [v for _,v in sorted([(k,v) for k, v in d.items() if v and k.startswith('parameter')])]
['Foo', 'M', 'D', 'L', 'CMAX', 'R']
>>>
注意,您将不得不以某种方式循环

更具可读性的版本:

>>> selection = [(k,v) for k, v in d.items() if v and k.startswith('parameter')]
>>> [v for _,v in sorted(selection)]
['Foo', 'M', 'D', 'L', 'CMAX', 'R']
编辑:主要警告 注意,如果值可以是
0
或您实际需要的任何其他falsy值,则这将不起作用,例如:

>>> pprint(d)
{'id': 7542,
 'parameter_001': 'Foo',
 'parameter_002': 'M',
 'parameter_003': 'D',
 'parameter_004': 'L',
 'parameter_005': 'CMAX',
 'parameter_006': 'R',
 'parameter_007': False,
 'parameter_008': False,
 'parameter_009': False,
 'parameter_010': False,
 'parameter_011': 0}
>>> selection = [(k,v) for k, v in d.items() if v and k.startswith('parameter')]
>>> [v for _, v in sorted(selection)]
['Foo', 'M', 'D', 'L', 'CMAX', 'R']
因此,如果您想特别过滤
False
的实例(而不是
0
),那么您必须使用
is

这里有一个解决方案:

list(zip(*sorted(i for i in d.items() if i[0].startswith('parameter') and i[1])))[1]

# ('Foo', 'M', 'D', 'L', 'C<sub>MAX</sub>', 'R')
list(zip(*已排序(如果i[0],则i代表d.items()中的i)。startswith('parameter')和i[1])[1]
#(‘Foo’、‘M’、‘D’、‘L’、‘CMAX’、‘R’)
解释

  • 我们筛选了两个条件:键以“参数”开头,值为Truthy
  • sorted
    on
    d.items()
    返回按字典键排序的元组列表
  • list(zip(*…)[0]
    返回上一次筛选和排序后的值元组
  • 我没有处理
    ,因为我不知道这是从哪里来的,也不知道应该应用什么逻辑来删除这个(和其他?)标记
    • 这里有一个解决方案:

      list(zip(*sorted(i for i in d.items() if i[0].startswith('parameter') and i[1])))[1]
      
      # ('Foo', 'M', 'D', 'L', 'C<sub>MAX</sub>', 'R')
      
      list(zip(*已排序(如果i[0],则i代表d.items()中的i)。startswith('parameter')和i[1])[1]
      #(‘Foo’、‘M’、‘D’、‘L’、‘CMAX’、‘R’)
      
      解释

      • 我们筛选了两个条件:键以“参数”开头,值为Truthy
      • sorted
        on
        d.items()
        返回按字典键排序的元组列表
      • list(zip(*…)[0]
        返回上一次筛选和排序后的值元组
      • 我没有处理
        ,因为我不知道这是从哪里来的,也不知道应该应用什么逻辑来删除这个(和其他?)标记

      那是JSON不是python dict(提示:
      false
      )完全正确,我打印了JSON而不是python dict。我编辑了问题,现在它是python dict。那是JSON不是python dict(提示:
      false
      )完全正确,我打印了JSON而不是python dict。我编辑了问题,现在它是一个Python dict。这非常有用,我只是对它做了一点修改,并使用了一个中间变量,使第二遍更容易阅读。@M.E.顺便说一句,我添加了一个编辑,其中有一条关于可能需要保留的错误值的警告,例如相关的
      0
      。我只想过滤
      False
      的实例。感谢您的警告。这非常有用,我只是对它做了一点修改,并使用了一个中间变量,使第二遍更易于阅读。@M.E.顺便说一句,我添加了一个关于您可能要保留的错误值可能性的警告编辑,例如,
      0
      ,这是相关的。我只想过滤
      False
      的实例。谢谢你的警告。
      有误导性,我应该在问题中删除它,它只是字符串的一部分,不需要执行任何操作。我发现juanpa.arrivillaga更容易理解/阅读。没问题,
      zip
      有时有点“非线性”。这个
      有误导性,我应该在问题中删除它,它只是字符串的一部分,不需要做任何操作。我发现juanpa.arrivillaga更容易理解/阅读。没问题,
      zip
      有时有点“非线性”。