Python 基于值删除列表中的常用词典
如何根据其中一个包含字符的词典删除词典列表中所有对应的词典Python 基于值删除列表中的常用词典,python,list,dictionary,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' }, ] 例如,由
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=a
中的一个y
中有一个/
,我如何删除所有x=a
?根据上述示例数据,我想在这里了解:
cleaneddata = [
{ 'x' : 'b', 'y' : '1' },
{ 'x' : 'b', 'y' : '1' },
{ 'x' : 'b', 'y' : '1' },
]
我有一个带有许多网络设备转储的CSV(通过DictReader导入)。不幸的是,每个设备名称都在“x”中重复。模块以“y”表示。我不可避免地试图通过将设备分组并列出每个设备的所有模块来重构设备。在CSV数据中,有一些设备我不关心。这些可以通过“y”中的某些特征来识别。因此,我的想法是先从数据中识别并清除它们。我愿意接受一种更优化的数据清理方法。基本上
for p in data:
if '/' in p['y']:
cleaneddata = [q for q in data if q['x'] != p['x']]
break
根据您的更新,我建议您从CSV创建一个类似dict的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
如果您的代码>行具有比仅模块更多的数据,则可以考虑DISTS列表(EEEK:):
然后:
clean_devices = {}
for dev, row in devices.items():
if all('/' not in m for m in row['modules']):
clean_devices[dev] = row
也许是这样的
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的任何数据,因此如果y有整数以外的任何东西?是的,在数据中有字符串,确保。。。我有一个带有许多网络设备转储的CSV(通过DictReader导入)。不幸的是,每个设备名称都在“x”中重复。模块以“y”表示。我不可避免地试图通过将设备分组并列出每个设备的所有模块来重构设备。在CSV数据中,有一些设备我不关心。这些可以通过“y”中的某些特征来识别。因此,我的想法是先从数据中识别并清除它们。我愿意接受一种更为优化的数据清理方法-Thx@pythoonatic:谢谢你的澄清。我为了其他人的利益编辑了它。谢谢。你回答了我的问题。我想我现在意识到,我把问题简化了。我还有其他的专栏,我需要在模块中附带csv。所以说“z”键有模块描述。不需要对此采取任何行动,只需随身携带信息,以便稍后显示。您是否有机会更新以支持此功能?
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