根据值删除列表中的常用词典

时间:2014-08-20 16:08:33

标签: python list dictionary

如何根据其中一个字典中的字典删除字典列表中的所有相应字典。

data = [
       { 'x' : 'a', 'y' : '1' },
       { 'x' : 'a', 'y' : '1/1' },
       { 'x' : 'a', 'y' : '2' },
       { 'x' : 'b', 'y' : '1' },
       { 'x' : 'b', 'y' : '1' },
       { 'x' : 'b', 'y' : '1' },
    ]

例如,如何删除x = ayx=a之一的所有/?根据上面的示例数据,这里是我想要的地方:

cleaneddata = [
       { 'x' : 'b', 'y' : '1' },
       { 'x' : 'b', 'y' : '1' },
       { 'x' : 'b', 'y' : '1' },
    ]

我有一个带有许多网络设备转储的CSV(通过DictReader导入)。不幸的是,每个设备名称都以“x”重复。模块位于“y”。我不可避免地试图通过对设备进行分组并列出每个设备的所有模块来重建设备。在CSV数据中,有我不关心的设备。这些可以通过“y”中的某些特征来识别。因此,我的想法是预先从数据中识别和清除它们。我愿意采用更优化的方法来清理数据。

2 个答案:

答案 0 :(得分:2)

基本上

for p in data:
    if '/' in p['y']:
        cleaneddata = [q for q in data if q['x'] != p['x']]
        break

根据您的更新,我建议您从CSV创建类似device->module的词典:

from collections import defaultdict

devices = defaultdict(list)
for row in data:
    devices[row['x']].append(row['y'])

然后删除您不感兴趣的设备:

clean_devices = {}
for dev, modules in devices.items():
    if all('/' not in m for m in modules):
        clean_devices[dev] = modules

如果您的rows拥有的数据多于模块,您可以考虑使用dicts列表(eek :):

devices = defaultdict(list)
for row in data:
    devices[row['x']].append(row)

然后:

clean_devices = {}
for dev, row in devices.items():
    if all('/' not in m for m in row['modules']):
        clean_devices[dev] = row

答案 1 :(得分:0)

这样的事可能吗?

x_excludes = set([d["x"] for d in data if not d["y"].isdigit()])
new_list = [d for d in data if d["x"] not in x_excludes]
print new_list

这首先根据某些条件创建一个坏X值列表(在这种情况下,如果Y中有任何非数字字符)

然后它只过滤掉我们先前计算的坏X值集合中存在X的任何数据