如果我有2D数组:
[['Wolfe Lane Community Garden', 'X', 'XXX', 'XX',
'XXXXX', 'XX', 'XXX', '0.05', 'XXXX'], ...]
我只想提取第一个元素和第八个元素。我怎样才能使用列表理解来做到这一点?还是过滤功能?
我需要才能使用列表理解。
答案 0 :(得分:3)
听起来你想要列表列表的每个子列表中的第一个和第八个元素。如果必须使用列表推导,则可以使用enumerate
:
data = [['Wolfe Lane Community Garden', 'X', 'XXX', 'XX',
'XXXXX', 'XX', 'XXX', '0.05', 'XXXX'], ...]
indices = [0, 7]
[[x for i, x in enumerate(sublist) if i in indices] for sublist in data]
这就是说其他一个答案,它使用理解来遍历索引而不是整个子列表,效率更高。
值得注意的是,您还可以使用numpy
来执行此类索引:
import numpy as np
data_arr = np.array(data)
data_arr[:, indices]
答案 1 :(得分:3)
你可以步:
l = [['Wolfe Lane Community Garden', 'X', 'XXX', 'XX',
'XXXXX', 'XX', 'XXX', '0.05', 'XXXX']]
print([sub[::7] for sub in l])
[['Wolfe Lane Community Garden', '0.05']]
使用comp获取列表列表:
print([[sub[x]for x in (0,7)] for sub in l ])
[['Wolfe Lane Community Garden', '0.05']]
没有循环的索引:
print([[sub[0], sub[7]] for sub in l ])
[['Wolfe Lane Community Garden', '0.05']]
或者使用comp和flat list:
print([sub[x] for sub in l for x in (0,7) ])
['Wolfe Lane Community Garden', '0.05']
您使用的内容取决于您是想要平面列表还是列表列表。
如果您想要一种有效的方法来展平使用itertools.chain:
from itertools import chain
print(list(chain.from_iterable((sub[0],sub[7]) for sub in l)))
你实际上可以制作一个列表comp:
print([ele for ele in chain.from_iterable((sub[0],sub[7]) for sub in l)])
答案 2 :(得分:1)
为什么不呢:
myarray = ['Wolfe Lane Community Garden', 'X', 'XXX', 'XX',
'XXXXX', 'XX', 'XXX', '0.05', 'XXXX']
first = myarray[0]
seventh = myarray[6]
变量名后面的括号表示正在访问的数组的元素。
答案 3 :(得分:1)
为什么你不能只根据索引获取项目?这是最简单的方法,特别是因为你知道你需要得到什么物品。
答案 4 :(得分:0)
最好的方法是将operator.itemgetter()
与map()
一起使用。
from operator import itemgetter
data = [['Wolfe Lane Community Garden', 'X', 'XXX', 'XX', 'XXXXX', 'XX', 'XXX', '0.05', 'XXXX']]
print map(itemgetter(0, 7), data)
# OUT: [('Wolfe Lane Community Garden', '0.05')]
答案 5 :(得分:0)
代码:
lst = [['Wolfe Lane Community Garden', 'X', 'XXX', 'XX', 'XXXXX', 'XX', 'XXX', '0.05', 'XXXX'], ...]
使用map
功能:
print map(lambda x: [x[0], x[6]], lst)
使用list
理解:
print [[x[0], x[6]] for x in lst]