根据二维列表条件生成Python列表
假设我有一个列表,其中包含多个子列表。每个子列表有三个元素,长得像这样:
['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中测试过)