2016-12-26 78 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