我有一个项目列表
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
项和if 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)
我认为这是错误的,请在此提出我的逻辑。我无法前往" elif"条件作为我的selectionsFromTable包含"表"。
答案 0 :(得分:3)
根据您提供的示例,以下检查不起作用 -
data['elements'] in selectionsFromTable
这是因为,selectionsFromTable
包含set
个类型,而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
中data['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'}]]