正在筛选Python中的词典。。。再一次

正在筛选Python中的词典。。。再一次,python,dictionary,filter,Python,Dictionary,Filter,是的,这个网站上有很多关于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的数据值。结果

是的,这个网站上有很多关于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字典有这样的方法吗?(顺便说一句,将时间表示为字符串完全是偶然的,这只是我在这里表达问题的一种简洁方式。)谢谢。

我首先以更好的类似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'}]

首先,我将以更好的类似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'}]

我会同意Blender的方法。但是,如果您想坚持当前的数据结构,可以使用dict/list理解:

data_and_time = { k: [i for i in v if i >= 5] for k, v in data_and_time.iteritems() }
当然,您必须修改i>=5部分来处理日期格式。我没有把它包括在这里,因为你提到你在这里只是为了简化你的例子


希望能有帮助。

我同意Blender的方法。但是,如果您想坚持当前的数据结构,可以使用dict/list理解:

data_and_time = { k: [i for i in v if i >= 5] for k, v in data_and_time.iteritems() }
当然,您必须修改i>=5部分来处理日期格式。我没有把它包括在这里,因为你提到你在这里只是为了简化你的例子


希望这有帮助。

如果您需要保留数据结构:

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

如果需要保留数据结构,请执行以下操作:

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

你能改变数据的结构吗?我认为这是痛苦的真正根源。你能改变数据的结构吗?我认为这是痛苦的真正根源。类似于zip中v的
[dict(zip(data_和_time,v)](*data_和_time.values())]
会更一般。@DSM:我只是想做这样的事情。感谢像
[dict(zip(data_和_-time,v))这样的方法在zip中为v(*data_和_-time.values())]
会更一般。@DSM:我只是想做一些类似的东西。谢谢