【问题标题】:Splicing lists within a list在列表中拼接列表
【发布时间】:2014-07-19 15:13:52
【问题描述】:

返回子列表中每四个数字的最简洁方法是什么,将所有数字列表视为一个列表?

A = [ ['a',[1,2,3]], ['b',[4,5]], ['c',[6,7,8,9,10]] ]

打印列表 A 时,我希望结果如下所示:

[ ['a',[1]], ['b',[5]], ['c',[9]] ]

我可以看出这与拼接单个列表有何相似之处,我会在其中使用 [::4] 之类的东西。我猜我必须在这里使用它和其他东西,将数字列表视为一个列表。

【问题讨论】:

    标签: python list splice


    【解决方案1】:

    你可以做一个列表理解! list = [x[::2] for x in A]

    和你写的更接近一点的是:

    list =[[x[0], x[1][::2]] for x in a]
    

    【讨论】:

    • 嗯,只返回 [['a'], ['b'], ['c']]。此外,我尝试了 [x[1][::2] for x in A],但可以预见的是它返回了 [[1, 3], [4], [6, 8, 10]] 这不是我想要的。我希望拼接时将数字列表视为一个列表。
    • 哦,你想要偶数,而不是偶数索引。我明白了
    • 另一个答案应该是你想要的。当您给出 [::2] 时,我有点困惑,因为我认为这就是您想要的。
    【解决方案2】:

    我会使用itertools.count(),这是一个方便的生成器,可以返回递增的数字。使用它,它几乎与您最初提出的问题相同,仍然使用嵌套列表理解:

    >>> from itertools import count
    >>> c = count()
    >>> B = [[let, [n for n in nums if next(c) % 4 == 0]] for let, nums in A]
    >>> B
    [['a', [1]], ['b', [5]], ['c', [9]]]
    

    之所以有效,是因为第一次调用 next(c) 时,它给出 0、0 % 4 == 0,所以我们保留 n,下次我们得到 1 时,我们不保留它,等等。


    [关于删除偶数元素的原始问题的答案:]

    您可以嵌套列表推导:

    >>> A = [['a',[1,2,3]], ['b',[4,5]], ['c',[6,7,8,9,10]]]
    >>> B = [[letter, [n for n in nums if n % 2 != 0]] for letter, nums in A]
    >>> B
    [['a', [1, 3]], ['b', [5]], ['c', [7, 9]]]
    

    【讨论】:

    • 这绝对更接近我正在寻找的东西!但是,如果我不仅想要每一个奇数,甚至每四个数字,我将如何表达列表理解,这将导致: [ ['a',[1]], ['b' ,[5]], ['c',[9]] ].
    • 然而,我现在意识到我的问题表达得很糟糕!希望您仍然愿意在这里的 cmets 中帮助我解决它,还是我应该编辑我原来的问题措辞?
    • 原问题已编辑,麻烦您了!现在应该清楚多了。
    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 2013-06-13
    • 2011-08-30
    • 2021-03-04
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多