0

给定一个带有子列表的列表,我想提取具有指定长度的子列表。如果子列表的长度小于指定的长度,则全部提取。请参阅下面的说明

在下面的示例中,我正在提取长度 = 2 的子列表。如果长度更大,我将提取子列表中的前两个元素并忽略其余元素。输入

A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]],['G',[7,6,5,4]]]

输出

B = [['A',[1,2]],['D',[3,4]],['E',[6,7]],['F',[1]],['G',[7,6]]]

我目前正在做如下,它的工作原理,但想知道是否有一个简单的方法

B=[]

for el in A:
  l = []

  if len(el[1]) > 2:
     l.append(el[0])
     l.append(el[1][0:2])
     B.append(l)

  else:
     l.append(el[0])
     l.append(el[1][0:2])
     B.append(l)

print B
4

5 回答 5

3

您可以为此使用列表理解:

In [71]: A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]],['G',[7,6,5,4]]]

In [72]: [[x[0],x[1][:2]] for x in A]
Out[72]: [['A', [1, 2]], ['D', [3, 4]], ['E', [6, 7]], ['F', [1]], ['G', [7, 6]]]
于 2013-02-01T04:05:42.997 回答
1

您可以利用map功能

>>> a=[[1,[1,2,3]],[2,[1]],[3,[1,2]]]
>>> map(lambda v: [v[0],v[1][:2]], a)
[[1, [1, 2]], [2, [1]], [3, [1, 2]]]
于 2013-02-01T04:09:07.633 回答
0

map在子列表的每个项目上使用,因为'A'[:2]只会返回'A'

In [115]: A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]],['G',[7,6,5,4]]]

In [116]: [map(lambda x:x[:2],x) for x in A]
Out[116]: [['A', [1, 2]], ['D', [3, 4]], ['E', [6, 7]], ['F', [1]], ['G', [7, 6]]]
于 2013-02-01T04:26:26.613 回答
0

如果您不想创建新列表,只需执行

>>> A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]],['G',[7,6,5,4]]]
>>> for X in A:
    X[1]=X[1][:2]


>>> A
[['A', [1, 2]], ['D', [3, 4]], ['E', [6, 7]], ['F', [1]], ['G', [7, 6]]]
于 2013-02-01T05:25:02.033 回答
0

如果您想以递归方式进行

import collections

def doMagic(data):
    if isinstance(data, collections.Iterable):
        if all(type(elem) in [type(1), type('a')] for elem in data):
            return data[:2]
        else:
            return [doMagic(elem) for elem in data][:2]
    else:
        return data

if __name__ == '__main__':
    data = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]],['G',[7,6,5,4]]]
    print [doMagic(elem) for elem in data]
于 2013-02-01T05:55:54.740 回答