是的,这个网站上有很多关于装配python字典的问题。但是我所看到的一切都没有达到我想做的事情。所以,我有一本字典。它包含一些列表和一些数据值列表。像
这样的东西data_and_time = {"time":['2:30','2:45','3:25','5:15','7:21','8:22'],
"data":[ 5., 7., 2., 3., 8., 10.]}
我想过滤这个,以便,例如,我只有大于或等于5的数据值。结果是:
data_and_time_5 = {"time":['2:30','2:45','7:21','8:22'],
"data":[ 5., 7., 8., 10.]}
我可以想到一些方法来做到这一点 - 所有这些都非常难看并且需要多行代码。我想要一种优雅,可读的方式来做到这一点。 python词典有这样的方法吗? (顺便说一下,时间表示为字符串是完全偶然的,这只是我在这里表达问题的一种紧凑方式。)谢谢。
答案 0 :(得分:5)
我首先要以更好的,类似JSON的格式存储数据:
data = [dict(zip(data_and_time, val)) for val in zip(*data_and_time.values())]
看起来像这样:
>>> data
[{'data': 5.0, 'time': '2:30'},
{'data': 7.0, 'time': '2:45'},
{'data': 2.0, 'time': '3:25'},
{'data': 3.0, 'time': '5:15'},
{'data': 8.0, 'time': '7:21'},
{'data': 10.0, 'time': '8:22'}]
现在,您可以更轻松地过滤对象:
>>> [item for item in data if item['data'] >= 5.0]
[{'data': 5.0, 'time': '2:30'},
{'data': 7.0, 'time': '2:45'},
{'data': 8.0, 'time': '7:21'},
{'data': 10.0, 'time': '8:22'}]
答案 1 :(得分:0)
我会选择Blender的方法。但是,如果您想坚持使用当前的数据结构,可以使用dict / list comprehensions:
data_and_time = { k: [i for i in v if i >= 5] for k, v in data_and_time.iteritems() }
当然,你必须修改i> = 5部分来处理日期格式。我没有把它包含在这里,因为你提到了你在这里只是为了简化你的例子。
希望有所帮助。
答案 2 :(得分:0)
如果您需要保留数据结构:
data_and_time = {"time": ['2:30', '2:45', '3:25', '5:15', '7:21', '8:22'],
"data": [5., 7., 2., 3., 8., 10.]}
#it builds list like a [True, True, False, ...]
index = map(lambda x: x >= 5, data_and_time['data'])
#and then 'applies' it to 'columns' of data_and_time
data_and_time = {k: [e for e in itertools.compress(v, index)]
for k, v in data_and_time.iteritems()}
结果:
{'data': [5.0, 7.0, 8.0, 10.0],
'time': ['2:30', '2:45', '7:21', '8:22']}