根据键列表拆分字典

时间:2016-12-26 11:06:25

标签: python dictionary

我有一个带有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>

3 个答案:

答案 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 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}

答案 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 构造函数的映射。你也可以使用旧的字典理解。