我有一个带有eeg,陀螺仪和其他数据的数据字典。为了处理,我想以单独的方式提取eeg和陀螺仪数据。因此,我有两个列表,其中包括eeg和陀螺仪的按键。我使用了两个字典理解,但也许有一个更平滑的解决方案。
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<script src="https://code.angularjs.org/1.5.8/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body ng-controller="videoController">
<div ng-repeat="media in product">
<div class="thumbnail">
<div class="video-container">
<iframe width="100%" ng-src="{{getIframeSrc(media.src)}}" frameborder="0 " allowfullscreen></iframe>
</div>
</div>
</div>
</body>
</html>
答案 0 :(得分:4)
不,两个字典理解就是这样。您可以使用dictionary views选择存在的密钥,可能是:
eegData = {key: data[key] for key in data.keys() & eegKeys}
gyroData = {key: data[key] for key in data.keys() & gyroKeys}
如果您仍在使用Python 2,请使用data.viewkeys()
。
字典视图为您提供了一个类似集合的对象,然后您可以在其上使用set操作; &
为您提供了交集。
请注意,使用key in eegKeys
和key 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}
答案 1 :(得分:3)
稍作修改,但这应该只是一点点清洁:
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})
答案 2 :(得分:2)
如果您使用的是 Python 3,更新的内联解决方案可能是:
second_dict = dict((d, first_dict.pop(d)) for d in split_keys)
pop
会轻轻地从第一个 dict 和生成器中删除元素,并创建要传递给 dict 构造函数的映射。你也可以使用旧的字典理解。