根据二维列表条件生成Python列表

0 投票
5 回答
3037 浏览
提问于 2025-04-16 09:17

假设我有一个列表,其中包含多个子列表。每个子列表有三个元素,长得像这样:

['apple', 'fruit', 1.23]

外层列表看起来是这样的:

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

我想遍历这个外层列表,只在某个元素(比如说元素1)匹配特定关键词(比如:'水果')的情况下,把数据放到一个临时列表里。所以,如果我在找水果,最后得到的结果会是这样的:

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

这是实现这个目标的一种方法:

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

有没有什么更“Pythonic”的方法可以用更少的代码行来做到这一点呢?

5 个回答

3

元组赋值可以让代码更容易理解,配合列表推导式使用,可以让代码更简洁:

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

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当一个按钮被点击时,程序就会做出反应。这种情况我们通常会用“事件”来描述。

事件就像是生活中的一些事情,比如说你按下了电灯开关,灯就亮了。这里的“按下开关”就是一个事件,而“灯亮了”就是这个事件触发后发生的结果。

在编程中,我们可以设置一些“监听器”,就像是一个守卫,时刻关注着这些事件的发生。当事件发生时,监听器就会通知程序去执行相应的操作。

例如,如果你在网页上点击了一个按钮,程序就会通过监听器捕捉到这个点击事件,然后执行你预先设定好的代码,比如显示一条消息或者改变页面的内容。

总之,事件和监听器的结合让我们的程序能够对用户的操作做出反应,使得程序更加生动和互动。

[(i, k) for i, j, k in data if j == 'fruit']
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中测试过)

撰写回答