从2D列表创建python条件列表

时间:2011-01-01 21:57:53

标签: python list

说我有一份清单清单。说出三个元素的内部列表,大小如下:

['apple', 'fruit', 1.23]

外部列表看起来像这样

data = [['apple', 'fruit', 1.23],
        ['pear', 'fruit', 2.34],
        ['lettuce', 'vegetable', 3.45]]

我想迭代外部列表并仅在元素1匹配某个关键字(又名:'fruit')的情况下为临时列表剔除数据。所以,如果我匹配水果,我最终会得到这个:

tempList = [('apple', 1.23), ('pear', 2.34)]

这是实现此目的的一种方法:

tempList = []
for i in data:
   if i[1] == 'fruit':
      tempList.append(i[0], i[2])

是否有一些'Pythonic'方法可以用更少的行来做到这一点?

5 个答案:

答案 0 :(得分:5)

[(i, k) for i, j, k in data if j == 'fruit']

答案 1 :(得分:3)

列表推导,使用元组索引或切片

tempList = [(i[0], i[2]) for i in data if i[1] == 'fruit']
tempList = [i[:1]+i[2:] for i in data if i[1] == 'fruit']

此外,如果您不需要列表,只需要序列,生成器表达式。 (这里有元组解包)

>>> tempListGen = ((a,c) for a,b,c in data if b == 'fruit')
>>> tempListGen
<generator object <genexpr> at 0x0266FD50>
>>> print sorted(tempListGen)
[('apple', 1.23), ('pear', 2.34)]

(使用Python 2.7测试)

答案 2 :(得分:3)

元组赋值可以使代码更容易理解,并与对紧凑性的列表理解配对:

tempList = [(item, price) for item, kind, price in data if kind == 'fruit']

答案 3 :(得分:1)

列表理解!

tempList = [(i[0], i[2]) for i in data if i[1] == 'fruit']

将以更少的行提供相同的结果,并且可能执行得更快。

答案 4 :(得分:0)

[[x[0], x[2]] for x in data if x[1] == 'fruit']