根据条件从2D列表创建列表

时间:2017-08-02 05:14:02

标签: python list nested-lists

我在Python中有一个像

一样设置的2D数组
MY_ARRAY = [
    ['URL1', "ABC"],
    ['URL2'],
    ['URL3'],
    ['URL4', "ABC"]
]

我想只在第二个参数为" ABC"时才创建每个数组的第一个元素的数组。所以上面例子的结果是['URL1', 'URL4']

我尝试[x[0] for x in MY_ARRAY if x[1] == 'ABC'],但这会返回IndexError: list index out of range。我认为这是因为有时x[1]是不存在的。

我希望这是一个简单的单行。

5 个答案:

答案 0 :(得分:2)

您可以先将长度检查添加到过滤条件中。这是因为Python短路布尔表达式。

[ele[0] for ele in MY_ARRAY if len(ele) > 1 and ele[1] == 'ABC']

另请注意,此处的正确术语是列表列表,而不是数组。

答案 1 :(得分:2)

我认为你应该尝试这样做:

if len(x) > 1:
    if x[1] == 'ABC':
        #do something here

这是一种解决方法,但您可以使用以下方法在单行代码上尝试:

if len(x) > 1 and x[1] == "ABC"

干杯!

答案 2 :(得分:1)

试试这个

[x[0] for x in MY_ARRAY if len(x) > 1 and x[1] == 'ABC']

这种情况正在发生,因为您有两个列表只有一个项目而您正在尝试访问该列表中的第二个项目

答案 3 :(得分:1)

首先,让我告诉你是在正确的轨道,当x[1]不存在时你会得到错误

但是,如果事情变得复杂,那么坚持做一个单行的事情是一个坏习惯。

话虽如此,这是一个单行代码:

NEW_ARRAY = [x[0] for x in MY_ARRAY if len(x)>1 and x[1]=='ABC']

答案 4 :(得分:0)

我找到了一个适合我用途的简单解决方案。

[x[0] for x in MY_ARRAY if x[-1] == 'ABC']

x[-1]将始终存在,因为它是数组/列表中的最后一个元素。