如何从列表中检索特定值:python

时间:2015-07-29 17:29:59

标签: python python-3.x

我有一个项目列表

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包含"表"。

1 个答案:

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

这样做是为了尝试取selectionsFromTabledata['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'}]]