Python-将dict的某些字段转换为列表
我有以下Python指令: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',
{
'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
onsorted
返回按字典键排序的元组列表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
onsorted
返回按字典键排序的元组列表d.items()
返回上一次筛选和排序后的值元组list(zip(*…)[0]
- 我没有处理
,因为我不知道这是从哪里来的,也不知道应该应用什么逻辑来删除这个(和其他?)标记
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
有时有点“非线性”。