我有一个项目清单 list = [{ 'id': '1', 'elements': 'A', 'table': 'path/to/table1', 'chart': 'path/to/chart1', }, { 'id': '2', 'elements': 'B', 'table': 'path/to/table2', 'chart': 'path/to/chart2', }, { 'id': '3', 'elements': 'C', 'ta
list = [{ 'id': '1', 'elements': 'A', 'table': 'path/to/table1', 'chart': 'path/to/chart1', }, { 'id': '2', 'elements': 'B', 'table': 'path/to/table2', 'chart': 'path/to/chart2', }, { 'id': '3', 'elements': 'C', 'table': 'path/to/table3', 'chart': 'path/to/chart3', },] selectionsFromTable = [{('A','2011','Table','Total'), ('C','2011','Bar','Total'), ('B','Pie','2001','Total')}]
将list [‘elements’]与selectionsFromTable项进行比较,如果elem in selectionsFromTable == list [‘elements’],则将其各自的表或图表附加到arr [].
假设selectionsFromTable是从jquery获取的表单数据.项目的索引值和位置始终在此处更改.
我这样做.
arr = [] for data in list: if data['elements'] in selectionsFromTable: # Suggest condition here inner = [] if 'Table' in selectionsFromTable: print("table") inner.append({'id': data['id'], 'section_title': data['elements'], 'tableorChart': data['table'], }) elif 'Bar' in selectionsFromTable or 'Pie' in selectionsFromTable : print("chart") inner.append({'id': data['id'], 'section_title': data['elements'], 'tableorChart': data['chart'], }) arr.append(inner)
我认为这是错误的,请在此提出我的逻辑.因为我的selectionsFromTable包含“表格”,所以我无法进入“elif”状态.
根据您提供的示例,以下检查不起作用 –data['elements'] in selectionsFromTable
这是因为,selectionsFromTable包含集类型,而data [‘elements’]是一个字符串.您想要在selectionsFromTable中检查每个元素(集合)内部.
一个简单的方法 –
arr = [] for data in list: elem = next((s for s in selectionsFromTable if data['elements'] in s), None) if elem: inner = [] if 'Table' in elem: print("table") inner.append({'id': data['id'], 'section_title': data['elements'], 'tableorChart': data['table'], }) elif ('Bar' in elem) or ('Pie' in elem): print("chart") inner.append({'id': data['id'], 'section_title': data['elements'], 'tableorChart': data['chart'], }) arr.append(inner)
主要变化是线 –
elem = next((s for s in selectionsFromTable if data['elements'] in s), None)
这样做是为了尝试在selectionsFromTable中获取数据[‘elements’]中的第一个元素,或者如果不存在这样的元素(即生成器表达式甚至不产生单个值),它将返回None.
然后在下一行中我们检查elem是否不是None然后在基于elem(而不是selectionsFromTable)之后执行类似的逻辑.
此外,您不应该使用list作为变量的名称,它最终将屏蔽list()内置函数,您将无法在同一脚本中使用它.
示例/演示 –
>>> list = [{ ... 'id': '1', ... 'elements': 'A', ... 'table': 'path/to/table1', ... 'chart': 'path/to/chart1', ... }, ... { ... 'id': '2', ... 'elements': 'B', ... 'table': 'path/to/table2', ... 'chart': 'path/to/chart2', ... }, ... { ... 'id': '3', ... 'elements': 'C', ... 'table': 'path/to/table3', ... 'chart': 'path/to/chart3', ... },] >>> >>> selectionsFromTable = [{'A','2011','Table','Total'}, ... {'C','2011','Bar','Total'}, ... {'B','Pie','2001','Total'}] >>> arr = [] >>> for data in list: ... elem = next((s for s in selectionsFromTable if data['elements'] in s), None) ... if elem: ... inner = [] ... if 'Table' in elem: ... print("table") ... inner.append({'id': data['id'], ... 'section_title': data['elements'], ... 'tableorChart': data['table'], ... }) ... elif ('Bar' in elem) or ('Pie' in elem): ... print("chart") ... inner.append({'id': data['id'], ... 'section_title': data['elements'], ... 'tableorChart': data['chart'], ... }) ... arr.append(inner) ... table chart chart >>> import pprint >>> pprint.pprint(arr) [[{'id': '1', 'section_title': 'A', 'tableorChart': 'path/to/table1'}], [{'id': '2', 'section_title': 'B', 'tableorChart': 'path/to/chart2'}], [{'id': '3', 'section_title': 'C', 'tableorChart': 'path/to/chart3'}]]