2016-12-26 79 views
2

我有一个数据字典,包含eeg,陀螺仪和其他数据。为了处理,我想在单独的字典中提取eeg和陀螺仪数据。因此,我有两个eeg和陀螺仪的键列表。我使用两个字典解析工作,但也许有一个更顺利的解决方案。取决于键列表的分词典

eegKeys = ["FP3", "FP4"] 
gyroKeys = ["X", "Y"] 

# 'Foo' is ignored 
data = {"FP3": 1, "FP4": 2, "X": 3, "Y": 4, "Foo": 5} 

eegData = {x: data[x] for x in data if x in eegKeys} 
gyroData = {x: data[x] for x in data if x in gyroKeys} 

print(eegData, gyroData) # ({'FP4': 2, 'FP3': 1}, {'Y': 4, 'X': 3}) 
+3

'对于数据中的x,如果eegKeys中的x只能是'for eegKeys'中的x。也许可以做一个减少重复的功能。 –

+2

如果你的代码工作正常,你可能想试试[Code Review](http://codereview.stackexchange.com/)。 –

+0

@AlexHall如果您事先不知道数据实际上会包含什么,那么OP的代码更安全。 –

回答

1

小的修改,但是这应该只是一个点点清洁:

eegKeys = ["FP3", "FP4"] 
gyroKeys = ["X", "Y"] 

# 'Foo' is ignored 
data = {"FP3": 1, "FP4": 2, "X": 3, "Y": 4, "Foo": 5} 

filterByKey = lambda keys: {x: data[x] for x in keys} 
eegData = filterByKey(eegKeys) 
gyroData = filterByKey(gyroKeys) 

print(eegData, gyroData) # ({'FP4': 2, 'FP3': 1}, {'Y': 4, 'X': 3}) 

或者,如果您喜欢的一行:

eegKeys = ["FP3", "FP4"] 
gyroKeys = ["X", "Y"] 

# 'Foo' is ignored 
data = {"FP3": 1, "FP4": 2, "X": 3, "Y": 4, "Foo": 5} 

[eegData, gyroData] = map(lambda keys: {x: data[x] for x in keys}, [eegKeys, gyroKeys]) 

print(eegData, gyroData) # ({'FP4': 2, 'FP3': 1}, {'Y': 4, 'X': 3}) 
+0

谢谢!它看起来更清晰提取字典的理解,但正如在评论中提到的,我更喜欢用lambda表达式的真实方法。 – ppasler

2

不,两个字典的理解是非常多的。您可以使用dictionary views来选择都存在,也许按键:

eegData = {key: data[key] for key in data.keys() & eegKeys} 
gyroData = {key: data[key] for key in data.keys() & gyroKeys} 

使用data.viewkeys()如果你正在使用Python 2依然。

词典查看会给你一个类似集合的对象,然后你就可以使用set操作; &给你的交集。

注意你的方法,使用key in eegKeyskey in gyroKeys可以通过反向循环(循环在较小的列表,而不是更大的字典)来加快:

eegData = {key: data[key] for key in eegKeys if key in data} 
gyroData = {key: data[key] for key in gyroKeys if key in data} 
+0

谢谢,反转循环是一个好主意! – ppasler